私はプログラムに埋め込まれたHSQLDBを使用しようとしています。hsqldbでSQLSyntaxErrorExceptionを解決するにはどうすればいいですか?
ただし、テーブルを作成してデータベースにデータを挿入すると、エラーが発生します。
以下はエラーメッセージの一部です。
java.sql.SQLSyntaxErrorException: unexpected token: MAR required:)
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source)
データベースにデータを挿入すると発生します。
これは私のCREATE文です。
stmt.execute("CREATE TABLE IF NOT EXISTS readability (id INTEGER NOT NULL IDENTITY,"
+ "LOC INTEGER DEFAULT NULL, " + "numOfComments INTEGER DEFAULT NULL,"
+ "numOfBlankLines INTEGER DEFAULT NULL," + "numOfBitOperators INTEGER DEFAULT NULL,"
+ "readability double DEFAULT NULL," + "username varchar(255) DEFAULT NULL,"
+ "storedTime datetime DEFAULT NULL," + "methodname varchar(255) DEFAULT NULL,"
+ "classname varchar(255) DEFAULT NULL," + "patternrate double DEFAULT NULL,"
+ "maxNestedControl INTEGER DEFAULT NULL," + "programVolume double DEFAULT NULL,"
+ "entropy double DEFAULT NULL,"
+ "CONSTRAINT username FOREIGN KEY (username) REFERENCES user (username) ON DELETE NO ACTION ON UPDATE NO ACTION"
+ ");");
これは私のINSERTステートメントです。
stmt.executeUpdate(
"INSERT INTO readability (LOC, numOfComments, numOfBlankLines, numOfBitOperators,"
+ " readability, username, storedTime, methodname, classname, patternRate, maxNestedControl, programVolume, entropy) VALUES("
+ readability.getLOC() + ", " + readability.getNumOfComments() + ", "
+ readability.getNumOfBlankLines() + ", " + readability.getNumOfBitOperators() + ", "
+ readability.getReadability() + ", '" + readability.getUser().getUsername() + "', "
+ readability.getStoredTime() + ", '" + readability.getMethodName() + "', '"
+ readability.getClassName() + "', " + readability.getPatternRate() + ", "
+ readability.getMaxNestedControl() + ", " + readability.getProgramVolume() + ", "
+ readability.getEntropy() + ")",
Statement.RETURN_GENERATED_KEYS);
オブジェクトの可読性には、すべての属性が使用されています。
よろしくお願いいたします。 – user3649231
文字列をSQL文に連結しません。代わりに 'INSERT文に' PreparedStatement'を使用してください。 –
値をクエリ文字列に連結しません。あなたのコードはSQLインジェクションに対して脆弱で、おそらくエラーの原因でもあります。 [プレステージ・ステートメントを使用する](https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html)パラメータ・プレースホルダを使用し、適切なセッタで値を設定します。 –