当我以非批处理模式运行代码时,它可以工作:
PreparedStatement preparedStatement = connection.prepareStatement(
"DELETE FROM myTable WHERE id=58");
preparedStatement.execute();
但是,一旦我尝试以批处理模式运行它:
PreparedStatement preparedStatement = connection.prepareStatement(
"DELETE FROM myTable WHERE id=58");
preparedStatement.executeBatch();
它将不再删除表中的条目。我INSERTS
的所有内容都与executeBatch
完美配合,实际上除了DELETE
命令之外的所有内容都是如此。它没有任何类型的错误,它似乎忽略了命令并跳过它。如果我通过查看int []来检查受影响的列数,则返回它的空(int [] .length = 0)。
更新:我不相信这是一个权限问题,因为用户帐户具有完全root权限并可以访问所有命令。如果这是一个许可问题,那么它不应该以非批处理模式工作。
答案 0 :(得分:1)
问题在于,对于删除SQL语句,无论出于何种原因我忘记添加以下行:
preparedStatement.addBatch();
省略此行意味着PreparedStatement
从未添加到批处理中,因此从未执行过。当然没有警告或错误,因为SQL语句永远不会执行,它只是省略了。由于批处理中存在其他SQL批处理PreparedStatement
,因此不需要抛出空批处理异常(某些驱动程序将抛出异常,但这不能保证,因此不要依赖它)。
因此正确的代码是:
PreparedStatement preparedStatement = connection.prepareStatement(
"DELETE FROM myTable WHERE id=58");
preparedStatement.addBatch();
preparedStatement.executeBatch();
现在正如评论中所指出的,您通常不希望使用批处理执行单个SQL命令,这样做的原因是将问题隔离到特定的SQL命令。