2017-03-11 500 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語句中。相反,使用'PreparedStatement'作爲'INSERT語句。 –

+2

不要將值連接到查詢字符串中。你的代碼容易受到SQL注入的攻擊,也可能是錯誤的原因。 [使用準備好的語句](https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html)並使用參數佔位符並使用適當的設置器設置值。 –

回答

2

,不要串聯值到一個查詢字符串。你的代碼容易受到SQL注入的攻擊,也可能是錯誤的原因。 Use a prepared statement帶參數佔位符,並使用適當的setter設置值。然後

您的代碼將成爲像(留出了大量的列爲了簡潔):

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