如何判断从JDBC执行更改的行数
我不确定如何获得受SQL执行影响的行数。
我喜欢这样:
boolean isResultSet = statement.execute(arbitrarySQLCommand);
我可以获得该getUpdateCount()
方法影响的行数。很好 我的问题是更新计数为零时。这可能意味着:
这是DML语句,但不影响任何行。受影响的零行是有效的响应。我只是说某些条件没有得到满足。
这是一个非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语句。像这样:
- 从中提取第一个单词
arbitrarySQLCommand
。单词以空格或EOL行字符终止。 - 如果该词(忽略大小写)是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