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

一个在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,或者
    • (在批处理更新计数数组中转换为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。:)

以上是 Statement.executeUpdate()返回-1是什么意思? 的全部内容, 来源链接: utcz.com/qa/428845.html

回到顶部