3

我在这里错过了什么愚蠢的东西吗?

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()+"'";

编辑2:

这是完整的更新字符串:

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

6 回答 6

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 查询的更简洁的方法

于 2012-11-21T21:57:34.410 回答
3

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

完全同意 PreparedStatement 的评论。

于 2012-11-21T22:17:23.643 回答
2

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

于 2012-11-21T21:59:23.553 回答
1

您应该使用 PreparedStatements,因为所有字段都是字符串类型,我在这里看到的唯一问题是您传递带有字符' 的字符串,这会产生错误

于 2012-11-21T22:03:23.760 回答
0

正如其他人所说,您应该使用准备好的语句。事实上,考虑一下您的患者姓名中是否有撇号(如 O'Brien)。准备好的陈述将解决这个问题。

很难说没有看到最终的查询。

于 2012-11-21T22:03:44.987 回答
0

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

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

将帮助您轻松查看是否遇到此问题。此外,就像其他人提到的那样,如果您将使用PreparedStatement,您将不必担心 SQL 注入问题,也不会遇到这个问题。

于 2012-11-21T22:07:47.150 回答