2012-11-21 34 views
2

我在這裏錯過了一些愚蠢的東西嗎?語法錯誤與SQL在Java中

String update = "UPDATE Patients SET fullName = '" + patient.getName() + "', 
       houseNum = '" + patient.getHouseNum() + "', 
       address = '" + patient.getAddress() +"', 
       postCode = '" + patient.getPostCode() + "', 
       condition = '" + patient.getCondition() + "', 
       who = '" + patient.getWho() + "', 
       time = '" + patient.getTime() + "', 
       location = '" + patient.getLocation() + "', 
       actionTaken = '" + patient.getActionTaken() + "', 
       duration = '" + patient.getDuration() + "' 
       WHERE regNo = '" +patient.getNHSnum()+"'"; 

爲了它的緣故,我在這裏每一行都有新的格式。在我的文件中它是在一條線上。所有數據庫字段都是文本類型。

我得到的錯誤是:

[Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement. -3503 

編輯:

對於信息,下列工程確定:

String update = "UPDATE Patients SET fullName = '" + patient.getName() + "', 
       houseNum = '" + patient.getHouseNum() + "', 
       address = '" + patient.getAddress() +"', 
       postCode = '" + patient.getPostCode() + "', 
       condition = '" + patient.getCondition() + "' 
       WHERE regNo = '" +patient.getNHSnum()+"'"; 

EDIT2:

這裏更新嚴格克全:

UPDATE Patients SET fullName = 'Dave', houseNum = '5', address = 'Bla', postCode = 'PQ1 RS2', condition = 'Unknown', who = 'Test', time = 'Test1', location = 'Test2', actionTaken = 'Test3', duration = 'Test4' WHERE regNo = '1' 

正如我所說的,在這個例子中,數據庫中的每個字段類型的文本

+4

你錯過了一個事實,即你通過不用'PreparedStatement'參數來打開自己的SQL注入攻擊...... –

+0

'patient'對象中每個方法的返回類型是什麼? –

+0

最終查詢的樣子是怎樣的?在您的日期屬性中更新'.. –

回答

2

time是一個SQL保留字。最好是重新命名它,否則它通常是一個與銷售相關的引用,偏離標準SQL。

完全同意PreparedStatement備註。

+0

你我的朋友,是一個傳奇人物。 – AreYouSure

3

我會強烈建議您使用PreparedStatements,而不是簡單的聲明(這將導致SQl注射)。

下面是使用PreparedStatement執行更新的示例。

String query = "UPDATE TABLENAME SET COL1=?, COL2=? WHERE somecondistrue"; 
Statement st = connection.preparedStatement(query); 
st.setString(1, col1value); 
st.setString(2, col2Value); 
st.executeUpdate(); 

,你可以看到,這是一個使用JDBC 執行 SQL 查詢整潔的做法

2

你不需要像NUM和持續時間號字段中的逗號

+0

數據庫字段都是文本類型。 Patient的所有方法都返回String。 – AreYouSure

0

你應該使用預處理語句,sinse所有字段都是字符串類型,唯一的問題我可以看到這裏,你可以傳遞字符串以字符 ,這將產生一個錯誤

0

正如其他人所說,你應該使用準備好的語句。事實上,考慮一下你的患者姓名是否有撇號(如O'Brien)。準備好的陳述可以解決這個問題。

很難說,否則沒有看到最終查詢。

0

該問題可能是您嘗試更新的某些值包含撇號'或其他特殊字符。在執行語句之前,您可以打印update字符串,並查看是否屬於這種情況。一個簡單的:

System.out.println("update: "+update); 

將幫助您輕鬆地看到,如果你遇到這個問題。 此外,就像其他人所說的,如果您將使用PreparedStatement,則不必擔心SQL注入問題,也不會出現此問題。

+0

我在該問題的編輯中發佈了更新字符串。看不到任何明顯的錯誤。 – AreYouSure

+0

@Meekel你得到'update'字符串的錯誤?我使用了[SQLFiddle](http://www.sqlfiddle.com/#!3/89734/2)並確認您的更新正在運行。 – dan