我不确定如何从SQL执行中获取受影响的行数.
我喜欢这个:
boolean isResultSet = statement.execute(arbitrarySQLCommand);
我可以从getUpdateCount()方法获取受影响的行数.这一切都很好.我遇到的问题是更新计数为零时.这可能意味着:
>这是一个DML语句,但它不会影响任何行.受影响的零行是有效的响应.我只是意味着某些条件没有得到满足.
>这是一个非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
Arghhh!
我希望它是:
Returns:
either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) -1 for SQL statements that return nothing
(注意:我事先不知道任意SVLCommand的内容)
最终选择的方案
似乎没有一个真正的类似JDBC的解决方案.在我看来,JDBC的设计者在getUpdateCount上犯了一个严重的错误,它使用值0(零)来表示一个没有(按定义)影响行的语句,因为受影响的零行也是一个完全有效的结果值DML声明.
唯一可能的解决方案似乎是在SQL语句上进行某种模式匹配,以确定它是否是DML语句(INSERT,UPDATE,DELETE)或其他类型的SQL语句.像这样的东西:
>从任意SFLCommand中提取第一个单词.一个字终止了
通过空格或EOL行char.
>如果那个词(忽略
case)是INSERT,UPDATE或DELETE,然后是DML语句
并且getUpdateCount()的输出是相关的,否则是
getUpdateCount()的输出无关紧要.
丑陋且容易出错.但是这个问题出来的唯一可能的解决方案. 🙁