如何判断从JDBC执行更改的行数

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

我喜欢这样:

boolean isResultSet = statement.execute(arbitrarySQLCommand);

我可以获得该getUpdateCount()方法影响的行数。很好 我的问题是更新计数为零时。这可能意味着:

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

  2. 这是一个非DML语句(很可能是DDL语句)..根据定义,它不会更改行,因此更新计数始终为零(duh!)。或者换种说法: 更新计数 的概念对于此类语句毫无意义。

我想要的是能够 。怎么样?

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

返回值:

(1)SQL数据操作语言(DML)语句的行计数,或者(2)SQL语句不返回任何内容的行数

啊!

我希望是:

返回值:

(1)SQL数据操作语言(DML)语句的行计数或(2)-1不返回任何内容的SQL语句

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

回答:

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

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

  1. 从中提取第一个单词arbitrarySQLCommand。单词以空格或EOL行字符终止。
  2. 如果该词(忽略大小写)是INSERT,UPDATE或DELETE,则它是DML语句,并且from的输出getUpdateCount()是相关的,否则from的输出getUpdateCount()是不相关的。

丑陋且容易出错。但是,唯一的解决方案就是这个问题。:-(

回答:

最好的办法是检查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;

}

}

以上是 如何判断从JDBC执行更改的行数 的全部内容, 来源链接: utcz.com/qa/400889.html

回到顶部