2017-03-11 48 views
0

私はプログラムに埋め込まれた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); 

オブジェクトの可読性には、すべての属性が使用されています。

+0

よろしくお願いいたします。 – user3649231

+3

文字列をSQL文に連結しません。代わりに 'INSERT文に' PreparedStatement'を使用してください。 –

+2

値をクエリ文字列に連結しません。あなたのコードはSQLインジェクションに対して脆弱で、おそらくエラーの原因でもあります。 [プレステージ・ステートメントを使用する](https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html)パラメータ・プレースホルダを使用し、適切なセッタで値を設定します。 –

答えて

2

クエリ文字列に値を連結しないでください。あなたのコードはSQLインジェクションに対して脆弱で、おそらくエラーの原因でもあります。 Use a prepared statementにパラメータプレースホルダを設定し、適切なセッタで値を設定します。

あなたのコードは、(簡潔にするために、列の多くを残して)のようなものになるだろう:

try (PreparedStatement insert = connection.prepareStatement(
     "insert into readability (LOC, username) values (?, ?)", 
     Statement.RETURN_GENERATED_KEYS)) { 
    insert.setInt(readability.getLOC(); 
    insert.setString(readibility.getUser().getUsername()); 

    insert.executeUpdate(); 

    // handle generated keys... 
} 

ます。また、HibernateのようなORMを使用して検討する必要があります。

+0

ありがとうございました。私はあなたの答えに従ってこの問題を解決することができました。 – user3649231

関連する問題