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

Statement.executeUpdate()返回-1是什么意思?

张鹏云
2023-03-14
问题内容

一个在Management
Studio中工作并返回executeUpdate相同结果的查询,在我们可以找到的任何文档中都未定义。它应该只返回rowcount或。这是什么意思?如果重要的话,驱动程序是JDBC-
ODBC桥。executeUpdate``-1``0

例:

String query = "IF NOT EXISTS (SELECT * FROM animals WHERE animal_name ='" + a +"') INSERT INTO " + table + " (animal_name, animal_desc, species_id) VALUES ('" + a + "', '" + b + "', " + c + ")";
int result = statement.executeUpdate(query);
System.out.println(result);

该查询有效,因为该行已添加到数据库中,但是奇怪的是它返回-1,而文档说它只会返回0或行数(如我所纠正)。

更新:

在Management Studio中运行此命令将显示“命令已成功完成”。

IF NOT EXISTS (SELECT * FROM animals WHERE animal_name = 'a') 
INSERT INTO animals(animal_name, animal_desc, species_id) VALUES ('a', 'a', 1)

那应该意味着该方法应该返回0,因为它什么也不返回,对吗?


问题答案:

因此4年后,Microsoft在Github上开源了他们的JDBC驱动程序。我今天有一个关于这个问题的通知,并去了,一看,我相信我已经找到了罪魁祸首这里,mssql- jdbc/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerStatement.java:1713

基本上,驱动程序会尝试了解SQL Server发送的不是确定结果集的内容。根据评论,它是这样的:

  1. 首先检查错误。(1669年)

  2. 没有错。是结果集吗?(1680年)

  3. 不是错误或结果集。也许是T-SQL语句的结果?即,以下之一:

    • 对受影响的行数(从INSERT,UPDATE或DELETE)进行正计数,
    • 一个零,指示没有受影响的行,或者该语句是DDL,或者
    • -1表示语句成功,但是没有可用的更新计数信息 (在批处理更新计数数组中转换为Statement.SUCCESS_NO_INFO)。
      (1706年)
      4.
      以上都不是。最后一次机会…进入上面的解析器,我们知道moreResults最初是正确的。如果我们将moreResults设置为false,则将命中一个DONE令牌(DONE(FINAL)或DONE(批处理RPC)),该批处理指示该批处理总体上成功完成,但是没有有关单个语句的更新计数的信息。这与上面的最后一种情况类似,只是没有更新计数。那就是:我们有一个成功的结果(返回true),但是我们没有关于它的其他信息(updateCount
      = -1)。 (1693年)
  4. 到达这里的唯一方法(moreResults仍然为true,但是没有任何形式的明显结果)是TDSParser实际上没有解析 任何内容
    。也就是说,我们在回应中处于EOF。在那种情况下,确实没有更多结果。大功告成 (1717年)

(强调我的)

所以你们最后是对的。SQL根本无法分辨受影响的行数,默认为-1。:)



 类似资料:
  • 问题内容: 我们都知道,柔性属性是一个速记,和属性。其默认值为。它的意思是: 但我注意到,在很多地方都使用过。是速记还是?我不明白这是什么意思?我在谷歌搜索中找不到任何东西。 问题答案: 这里是解释: flex: 等同于flex:10。使flex项目具有弹性,并将flex基础设置为零,从而使该项目接收flex容器中指定比例的可用空间。如果flex容器中的所有项目都使用此模式,则它们的大小将与指定的

  • 我在我的一个项目中使用RxJava,我使用Android Studio插件将我的一个类转换为静态编程语言,并在maplambda(java中的Func1)之一中,中间体返回如下所示。 我不知道这意味着什么。

  • 问题内容: 当JavaScript网络调用(例如fetch或XMLHttpRequest或任何其他类型的HTTP网络请求)失败且HTTP状态代码为0时,这是什么意思? 这似乎不是有效的HTTP状态代码,因为其他代码是HTTP规范中的三位数字。 我尝试将网络完全拔掉作为测试。它可能不相关,但是导致状态代码17003(IIRC),粗略搜索表明这意味着“ DNS服务器查找失败”。 相同的代码在某些位置和

  • 以下方法返回由type元素组成的列表: 在签名中我们有

  • 经过几次修改后,我得到了一个工作函数,返回类型为nullable Void。但这并不是我所需要的 根据Kotlin文档,Unit类型对应于Java中的void类型。所以Kotlin中不返回值的正确函数是 或