2017-08-27 65 views
0

時候當我運行在非批處理模式下的代碼,它的工作原理:一旦JDBC似乎並不想打電話給刪除的PreparedStatement批處理對MySQL

PreparedStatement preparedStatement = connection.prepareStatement(
     "DELETE FROM myTable WHERE id=58"); 
preparedStatement.execute(); 

但是我嘗試在批處理模式下運行:

PreparedStatement preparedStatement = connection.prepareStatement(
     "DELETE FROM myTable WHERE id=58"); 
preparedStatement.executeBatch(); 

它不會再從表中刪除條目。我所有的INSERTSexecuteBatch都可以很好地工作,事實上除了DELETE命令外,其他的都是如此。它不會返回任何類型的錯誤,它似乎忽略該命令並跳過它。如果我通過查看int []來檢查受到影響的列的數量,它將返回空列表(int [] .length = 0)。

更新:我不認爲這是一個權限問題,因爲用戶帳戶具有完整的root權限並可以訪問所有命令。如果這是一個權限問題,那麼它不應該在非批處理模式下工作。

+0

是'id'主鍵? – nullpointer

+0

是的,這是一個主鍵 –

+0

該代碼將失敗,SQL語法錯誤。嘗試正確拼寫關鍵字,即「WHERE」,而不是「WERE」。 – Andreas

回答

1

的問題是,對於無論何種原因刪除SQL語句我忘了添加以下行:

preparedStatement.addBatch(); 

省略此線表示PreparedStatement從未被添加到批量,因此永遠不會執行。當然沒有警告或錯誤,因爲SQL語句從不執行,只是省略了。由於批處理中有其他SQL批處理PreparedStatement,因此不需要拋出空的批處理異常(某些驅動程序會拋出異常,但不能保證,因此不要依賴它)。

因此正確的代碼是:

PreparedStatement preparedStatement = connection.prepareStatement(
     "DELETE FROM myTable WHERE id=58"); 
preparedStatement.addBatch(); 
preparedStatement.executeBatch(); 

現在,作爲指向您通常不希望與配料執行一個SQL命令的註釋,這樣做的原因是爲了找出問題的特定的SQL命令。