Java中的SQL语法错误

时间:2012-11-21 21:55:41

标签: java sql

我在这里错过了一些愚蠢的东西吗?

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'

正如我所说,在这个例子中,数据库中的每个字段都是text

6 个答案:

答案 0 :(得分:3)

强烈建议您使用PreparedStatements,而不是简单的Statement(这将导致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查询更简洁的方法

答案 1 :(得分:2)

您不需要数字字段中的逗号,如num和duration

答案 2 :(得分:2)

time是SQL保留字。最好是重命名它,否则它通常是依赖于卖方的引用,偏离标准SQL。

完全同意PreparedStatement的评论。

答案 3 :(得分:0)

你应该使用Prepared Statements,因为所有字段都只是字符串类型我在这里看到的问题是你要传递字符'的字符串,这会产生错误

答案 4 :(得分:0)

正如其他人所说,你应该使用准备好的陈述。事实上,考虑一下你的病人姓名是否有撇号(如奥布莱恩)。准备好的陈述可以解决这个问题。

在没有看到最终查询的情况下很难说。

答案 5 :(得分:0)

问题可能是您尝试更新的某些值包含撇号'或其他特殊字符。您可以在执行语句之前打印update字符串,并查看是否是这种情况。一个简单的:

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

可以帮助您轻松查看是否遇到此问题。 另外,和其他人一样,如果您使用PreparedStatement,则不必担心SQL注入问题,也不会遇到此问题。