2013-07-07 133 views
0

我是Java和JDBC的新手。目前,我正在爲Java課程開展一個學校項目。我試圖通過使用JDBC一些Java變量的插入SQL查詢,但我得到了如下異常:JDBC插入查詢錯誤

SQLException: ORA-00917: missing comma 

這是指令:

stmt.executeUpdate("INSERT INTO question (idnum, question, option1, option2, option3, option4, answer) VALUES("+4+", "+question+", "+option1+", "+option2+", "+option3+", "+option4+", "+answer+")"); 

任何想法如何解決查詢?

+2

A)使用準備好的語句。 B)你的SQL有一個語法錯誤。打印您正在創建的字符串並查看原因。 –

+0

你需要逃避你的輸入。 –

回答

1

更改雙引號"對單引號'這樣

String query = "INSERT INTO question (idnum,question) values 
(4 , "'"+question+"'")"; 

請注意,只有字符串需要',你可以傳遞整數的情況下直接使用',不過,我更喜歡使用PreparedStatement,因爲它是使用SQL注入更容易和非常強大。

PreparedStatement pr = conection.prepareStatement("insert into question(...) values(?,?,?,?...)"); 
    pr.setInt(1,4); 
    pr.setString(2,"Some string"); 
//..... 
pr.executeUpdate(); 
+0

Downvoter,請您留下評論? – Azad

+0

我已經刪除了我的downvote,現在您添加了準備好的陳述。也就是說,我會徹底刪除第一位。沒有理由手動構建SQL,並且如OP所示,它很容易出錯。 –

+0

@BrianRoach:我同意你的觀點,我通常會解決問題,然後添加額外信息可能是最好的方法(如果我知道的話)。 – Azad

0

試試這個:

stmt.executeUpdate("INSERT INTO question (idnum, question, option1, option2, option3, option4, answer) VALUES("+4+", '"+question+"', '"+option1+"', '"+option2+"', '"+option3+"', '"+option4+"', '"+answer+"')" 
2

試試這個

String sql = 
    "INSERT INTO question (idnum, question, option1, option2, option3, option4, answer)  VALUES(?, ?, ?, ?, ?, ?, ?)"; 
PreparedStatement preparedStatement = connection.prepareStatement(sql); 

preparedStatement.setInt(1, 4); 
preparedStatement.setString(2, question); 
preparedStatement.setString(3, option1); 
preparedStatement.setString(4, option2); 
preparedStatement.setString(5, option3); 
preparedStatement.setString(6, option4); 
preparedStatement.setString(7, answer); 

int rowsAffected = preparedStatement.executeUpdate(); 
+0

謝謝Reimeus ...這工作完美!我想我需要開始使用PreparedStatements – JLA

+1

太棒了,很高興我使用'PrepareStatements'將你帶到(b)右側。不要忘記[接受答案](http://meta.stackexchange.com/a/65088/155831):) – Reimeus

2

首先,您收到了錯誤的原因是,你有你的SQL語法錯誤。只需打印您正在創建的String就會顯示問題。

也就是說,你應該使用prepared statements。這僅僅是沒有的原因,以手動構建SQL。它不僅可以避免您遇到的問題,而且可以消除您的代碼易受SQL注入影響的機會。

String query = "INSERT INTO question (idnum, question, option1, option2, option3, option4, answer) VALUES (?,?,?,?,?,?,?)"; 
PreparedStatement pstmt = conn.prepareStatement(query); 
pstmt.setInt(1,4); 
pstmt.setString(2,question); 
// ... set all your params 
pstmt.execute();