2013-05-05 78 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塊關閉語句,連接等)