2012-03-03 100 views
0

我正在使用Java + Connector/J + MySQL處理項目。 我需要使用一個PreparedStatement執行以下查詢。可能嗎?使用PreparedStatement執行多個插入 - Java

INSERT INTO FILES (FILENAME, FILESIZE, HASH) VALUES (a,b,c) 
ON DUPLICATE KEY UPDATE FILEID=LAST_INSERT_ID(FILEID); 
INSERT INTO DISTRIBUTES (PEERID, FILEID) VALUES (1,LAST_INSERT_ID()); 

當我嘗試執行此操作時,出現錯誤。我知道如何批量執行相同的INSERT語句,但我無法在一個語句中使用多個插入操作。

在Java執行上面的代碼,是這樣的:

 query = "INSERT INTO FILES (FILENAME, FILESIZE, HASHROOT, HASHLIST) VALUES (?,?,?,?)\n" + 
       "ON DUPLICATE KEY UPDATE FILEID=LAST_INSERT_ID(FILEID);\n" + 
       "INSERT INTO DISTRIBUTES (PEERID, FILEID) VALUES (" + peerID + ",LAST_INSERT_ID());"; 
     pstmt = null; 

     try 
     { 
      pstmt = conn.prepareStatement(query); 

      stmt.setString(1, files[i].getFileName()); 
      pstmt.setLong(2, files[i].getFileSize()); 
      pstmt.setString(3, /* Get some data here */); 
      pstmt.setBytes(4, /* Get some data here */); 
      pstmt.addBatch(); 
      pstmt.executeBatch(); 
     } 
     catch (Exception ex) 
     { 
      // Error handling 
     } 
     finally 
     { 
      // Close resources 
     } 

編輯:我在catch塊得到的錯誤,是說「你在你的SQL語法錯誤;檢查手冊,該手冊對應於您的MySQL服務器版本,以便在第3行「INSERT INTO DISTRIBUTES(PEERID,FILEID)VALUES(16,LAST_INSERT_ID())」附近使用正確的語法。「

+0

真的不能做太多沒有你的代碼... – christophmccann 2012-03-03 16:37:23

+0

什麼**是* *你得到的錯誤?並且不要吞下catch塊中的異常。至少打印出來! – 2012-03-03 17:08:55

+0

您是否試圖單獨執行這兩個語句而沒有「;」和「\ n」?我不熟悉Connector/J,但這些分號分隔的行看起來不太好。 – 2012-03-03 17:23:38

回答

0

您只能使用一個preparedStatement執行一條語句。你必須將sql分成兩個獨立的insert into ...序列。

而且

INSERT INTO DISTRIBUTES (PEERID, FILEID) VALUES (" + peerID + ",LAST_INSERT_ID());"; 

看起來並不像使用preparedStatment - 它已經硬編碼peerID,而不是佔位符?

相關問題