gpt4 book ai didi

java - 如何判断 JDBC 执行更改的行数

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:59 25 4
gpt4 key购买 nike

我不确定如何获取受 SQL 执行影响的行数。

我喜欢这样:

boolean isResultSet = statement.execute(arbitrarySQLCommand);

并且我可以获得受 getUpdateCount() 方法影响的行数。没关系。我遇到的问题是更新计数为零。这可能意味着:

  1. 这是一个 DML 语句,但它不影响任何行。零行受影响是有效响应。我只是说不满足某些条件。

  2. 这是一个非 DML 语句(最有可能是 DDL 语句).. 根据定义,它不会更改行,因此更新计数始终为零(呃!)。或者换句话说:更新计数的概念对于这样的语句是没有意义的。

我想要的是能够区分上述情况 1 和 2。怎么办?

我对产生输出的语句不感兴趣,所以我也可以使用 executeUpdate()但正如我所见,该方法的返回值具有相同的缺陷:

Returns:

either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing

哎呀!
我希望它是:

Returns:

either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) -1 for SQL statements that return nothing



(注意:我事先不知道arbitrarySQLCommand的内容)



最终选择的解决方案

似乎没有真正的类 JDBC 解决方案来解决这个问题。在我看来,JDBC 的设计者在 getUpdateCount 上犯了一个严重的错误,他们使用值 0(零)来表示不(根据定义)影响行的语句,因为受影响的零行也受到影响DML 语句结果的完全有效值。

唯一可能的解决方案似乎是对 SQL 语句进行某种模式匹配,以确定它是 DML 语句(INSERT、UPDATE、DELETE)还是其他类型的 SQL 语句。像这样:

  1. arbitrarySQLCommand 中提取第一个单词。一句话终止通过空格或 EOL 行字符。
  2. 如果那个词(忽略case) 是 INSERT、UPDATE 或 DELETE 那么它是一个 DML 语句并且 getUpdateCount() 的输出是相关的,否则getUpdateCount() 的输出无关紧要。

丑陋且容易出错。但是这个 SO 问题产生的唯一可能的解决方案。 :-(

最佳答案

你能做的最好的事情就是检查 SQL 语句

Set<String> dmlCommands = new HashSet<String>() {
{
add("UPDATE"); add("INSERT"); add("DELETE"); //Add more DML commands ....
}
};
int updateCount = statement.getUpdateCount();
for(String dml : dmlCommands) {
if(arbitrarySQLCommand.toUpperCase().contains(dml) && updateCount == 0) {
updateCount = -1;
break;
}
}

关于java - 如何判断 JDBC 执行更改的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17544782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com