一切似乎都是正确的 - SQL缺少逗号异常

时间:2013-05-05 06:13:45

标签: java sql oracle

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

id位于long,其他所有人都在string。我无法解决问题所在以及为什么它在Java中显示以下SQL消息。

missing comma exception

2 个答案:

答案 0 :(得分:8)

停止执行SQL的当前方式 - 难以阅读,可能导致转换问题,最重要的是容易受SQL Injection Attacks攻击。我怀疑问题是你的一个值包含一个',它有效地结束了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块来关闭语句,连接等。)

答案 1 :(得分: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注入漏洞)。