当前位置: 首页 > 面试题库 >

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

窦英武
2023-03-14
问题内容

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

我喜欢这样:

boolean isResultSet = statement.execute(arbitrarySQLCommand);

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

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

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

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

我对产生输出的语句不感兴趣,因此我也可以使用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;
    }
}


 类似资料:
  • 我不确定如何获得SQL执行所影响的行数。 我确实喜欢这样: 返回: (1)SQL数据操作语言(DML)语句的行计数,或(2)0表示不返回任何内容的SQL语句 啊! 我希望是: 从中提取第一个单词。字以空格或EOL行字符结束。 如果该单词(忽略大小写)是INSERT、UPDATE或DELETE,那么它是一个DML语句,并且的输出是相关的,否则的输出是无关的。 丑陋和容易出错。但这个问题唯一可能的解决

  • 问题内容: 我知道设计不能通过中断来控制其执行,但是我想其中有些人可能会遇到此问题。s是组成异步执行的一种非常好的方法,但是考虑到当您希望取消future时中断或停止基础执行时,我们该怎么做?还是我们必须接受,任何取消或手动完成的操作都不会影响正在执行该操作的线程? 我认为,那显然是一项无用的工作,需要花费执行者的时间。我想知道在这种情况下哪种方法或设计可能会有所帮助? 更新 这是一个简单的测试

  • 我知道设计无法通过中断来控制其执行,但我想你们中的一些人可能有这个问题。s是组成异步执行的非常好的方法,但考虑到当未来被取消时您希望底层执行被中断或停止的情况,我们如何做到这一点?或者我们必须接受任何取消或手动完成的都不会影响在那里工作以完成它的线程? 在我看来,这显然是一项无用的工作,需要执行者的时间。我想知道在这种情况下,什么方法或设计可能会有所帮助? 更新 这是一个简单的测试

  • 我试图建模双向亲子设计,有秩序的孩子。 从父级中删除子级(例如,子级#2/3子级)时,hibernate生成的sql会导致唯一的约束冲突,因为“更新”(同级)是在“删除”(目标)之前执行的。 我使用的RDBMS(H2)不支持延迟约束。除了以下选项外,我还有哪些选择? 从架构中删除唯一约束 自己显式管理排序,而不是依赖hibernate 有什么方法可以让Hibernate生成sql,在更新之前删除吗

  • 我是javascript新手,这可能是一个简单的问题。。。 我在这里所做的是修改div(#box)的css样式,这取决于你所在页面的位置( 我试图实现的是向#box添加多个css更改,并每次执行一个随机更改。例如,每次从最顶端滚动通过200,div的显示高度为:绿色背景为“100px”,蓝色背景为“200px”,或红色背景为“300px”。希望这有意义。。。。

  • 我正在尝试使用JavaDOM解析器为XML文档中的许多标记建立索引,以从中形成类似MIB的结构(例如 我希望将模块映射到1,将容器映射到1.1,将列表映射到1.1.1,将叶映射到1.1.1.1,将另一个叶映射到1.1.1.2(我已经有了这样做的方法),但在嵌套相同命名的XML标记时,我遇到了问题。以下是我创建的函数——为了简单起见,只需打印属性名 下面是我试图解析的XML示例: 当我在这个程序上运