2013-05-05 73 views
-2
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消息消息。一切似乎还不错 - SQL缺少逗号例外

missing comma exception 
+4

也许你的一个值中有一个报价?这是你应该使用'PreparedStatement'的一个原因。 – 2013-05-05 06:15:45

+0

你一定要在这里使用准备好的语句。尽管存在潜在的SQL语法错误,但您很容易受到[SQL注入漏洞](http://en.wikipedia.org/wiki/SQL_injection)的影响。 – Makoto 2013-05-05 06:17:41

+0

'错过了昏迷例外'我完全错过了我最后一次昏迷,但医生们并不认为这是例外。 ITYM **逗号**(2x'm')。 ;)请尽可能复制/粘贴输出。 – 2013-05-05 06:29:58

回答

1

不要只是构建字符串,并将它传递直经为executeUpdate(一)。该查询可能包含意外导致您的问题的东西。

相反,首先它变成一个字符串,这样你就可以打印出来以某种方式看看是否有什么错呢,是这样的:

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); 

(一)使用的原料字符串构建查询,而不是使用准备好的语句,这是很多人会提出的另一个问题,你应该听取它们,因为它可以使事情变得更安全。但是,这是关于查明为什么查询不能按预期工作的直接问题。

您可能会发现准备好的语句也,如果您有SQL语法标记(如逗号或引号)在你的领域解决这方面的问题,您凝固教育作为一个理由为什么你不应该使用原始字符串(另一个是SQL注入漏洞)。

+2

不要这样做* - 使用准备好的语句。 – 2013-05-05 06:24:04

+0

@Jon,是的,加了这个建议,但是发现实际的问题对于OP来说还是很有帮助的 - 理解他们为什么要使用预先准备的语句。 – paxdiablo 2013-05-05 06:26:54

+0

现在好多了。当它甚至没有提及准备好的陈述时,我可以很容易地看到OP找到问题并以某种方式解决问题,保持糟糕的代码。 – 2013-05-05 06:28:12

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块关闭语句,连接等)