2012-03-03 89 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,而不是占位符?

相关问题