-3
int  i =Db.getStatement().executeUpdate("insert into famous_place 
  values(img_id_seq.nextval,'"+name+"','"+
  location+"','"+dist+"','"+about+"','"+
  status+"','"+path+"',"+id+")");

idlong,所有其他人都在string。我不知道问题出在哪里以及为什么它在 Java 中显示以下 SQL 消息。

missing comma exception
4

2 回答 2

8

停止当前执行 SQL 的方式 - 它难以阅读,可能导致转换问题,最重要的是容易受到SQL 注入攻击。我怀疑问题在于您的一个值包含一个'有效地结束 SQL 中引用的值的值。

相反,使用PreparedStatement

String sql = 
   "insert into famous_place values(img_id_sq.nextval, ?, ?, ?, ?, ?, ?, ?)";
PreparedStatement statement = db.prepareStatement(sql);

statement.setString(1, name);
statement.setString(2, location);
statement.setString(3, dist);
statement.setString(4, about);
statement.setString(5, status);
statement.setString(6, path);
statement.setInt(7, id);

int rows = statement.executeUpdate();

(并使用适当的try/finally块来关闭语句、连接等)

于 2013-05-05T06:27:25.287 回答
1

不要只是构造字符串并将其直接传递给executeUpdate (a)。查询可能包含导致您的问题的意外内容。

相反,首先将它放入一个字符串中,以便您可以以某种方式将其打印出来,看看它是否有任何问题,例如:

string query = "insert into famous_place values(" +
    "img_id_seq.nextval,'" +
    name + "','" +
    location + "','" +
    dist + "','" +
    about + "','" +
    status + "','" +
    path + "'," +
    id + ")");
System.out.println ("[" + query + "]");
int  i =Db.getStatement().executeUpdate(query);

(a)在构造查询中使用原始字符串,而不是使用准备好的语句,是许多人会提出的另一个问题,您应该听听它们,因为它可以使事情变得更安全。但是,这是关于找出查询为什么没有按预期工作的直接问题。

如果您的字段中有 SQL 语法标记(如逗号或引号),您可能会发现准备好的语句也可以解决此特定问题,从而巩固您对不应使用原始字符串的一个原因的教育(另一个是 SQL 注入漏洞)。

于 2013-05-05T06:19:39.140 回答