2015-09-16 33 views
-1

我需要在更新sql時指定列名。 始終得到像下面的錯誤信息(使用=?):java mysql指定列總是錯誤

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL 
syntax; check the manual that corresponds to your MySQL 
server version for the right syntax to use near ''d11'=1 where cityid=11143' 
at line 1 

代碼片段

conn.setAutoCommit(false); 
    pstmt = conn.prepareStatement("update usercityday set ?=? where cityid=?"); 
    for (int i = 1; i < 91727; i++) { 
     for (int j = 1; j < 32; j++){ 
      if (map[i][j] != 0){ 
       pstmt.clearParameters(); 

       pstmt.setString(1, "d" + String.valueOf(j)); 
       pstmt.setInt(2, map[i][j]); 
       pstmt.setInt(3, i); 
       pstmt.executeUpdate(); 
       ic++; 
       if (ic %1000 == 0) { 
        conn.commit(); 
       } 
      } 
     } 
    } 

回答

0

你的第一個? in?=?不是一個字符串值。它是SQL代碼的一部分。您正在生成這樣的代碼:

update usercityday set 'd11'=11143 where cityid=2 

這不是一個有效的SQL。

一個簡單的解決辦法是指定循環內聲明並做SQL查詢的這樣一個使用concat:

conn.setAutoCommit(false); 
for (int i = 1; i < 91727; i++) { 
    for (int j = 1; j < 32; j++){ 
     if (map[i][j] != 0){ 
      pstmt = conn.prepareStatement("update usercityday set d"+String.valueOf(j)+"=? where cityid=?"); 
      pstmt.setInt(1, map[i][j]); 
      pstmt.setInt(2, i); 
      pstmt.executeUpdate(); 
      ic++; 
      if (ic %1000 == 0) { 
       conn.commit(); 
      } 
     } 
    } 
} 
0

我認爲你不能設置列名稱後記,因爲SQL是預編譯使用PreparedStatements時。您可以使用語句(可能導致SQL注入|不良),或者在創建語句之前設置列名稱。

+0

好的。我明白了,謝謝。 – ken