我已经创建了这样的声明:
String query = "INSERT INTO ZMONES (ID, PAVADINIMAS, SLAPTAZODIS) VALUES("
+sum+" ,"+a+", "+b+")";
其中变量sum是数据库表中的整数ID,a和b是要添加的两个字符串值。我正在执行此声明:stmt.executeUpdate(query);
然而,此错误会弹出:
专栏' PERSON'要么不在FROM列表中的任何表中,要么不在appers中 在连接规范中,并且超出了连接的范围 规范或出现在having子句中,不在GROUP BY中 名单。如果这是一个CREATE或ALTER TABLE语句,那么' PERSON'是 不是目标表中的列。
我确实理解Java将其解释为列的名称,但我不明白为什么会发生这种情况?我在stackoverflow中搜索了这个,大多数问题都是处理文本而不是字符串变量。
答案 0 :(得分:4)
您遇到的错误可以轻松纠正如下(假设sum
是一个数字):
String query = "INSERT INTO ZMONES (ID, PAVADINIMAS, SLAPTAZODIS) VALUES("
+sum+" ,'"+escape(a)+"', '"+escape(b)+"')";
其中escape(String)
是以下方法:
public String escape(String string) {
// This works in most databases, although some require you to escape apostrophes via \'
return string == null ? null : string.replace("'", "''");
}
但请!不要那样做。使用PreparedStatement
和正确的绑定变量,而不是将输入连接到SQL语句中。为什么呢?
以下是:
try (PreparedStatement s = connection.prepareStatement(
"INSERT INTO ZMONES (ID, PAVADINIMAS, SLAPTAZODIS) VALUES (?, ?, ?)")) {
s.setInt(1, sum);
s.setString(2, a);
s.setString(3, b);
s.executeQuery();
}
答案 1 :(得分:1)
您需要用引号括起字符串:
String query = "INSERT INTO ZMONES (ID, PAVADINIMAS, SLAPTAZODIS) VALUES("+sum+", '"+a+"', '"+b+"')";