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发送的不是确定结果集的内容。根据评论,它是这样的:
首先检查错误。(1669年)
没有错。是结果集吗?(1680年)
不是错误或结果集。也许是T-SQL语句的结果?即,以下之一:
- 对受影响的行数(从INSERT,UPDATE或DELETE)进行正计数,
- 一个零,指示没有受影响的行,或者该语句是DDL,或者
- (在批处理更新计数数组中转换为Statement.SUCCESS_NO_INFO)。
(1706年)
4.
以上都不是。最后一次机会…进入上面的解析器,我们知道moreResults最初是正确的。如果我们将moreResults设置为false,则将命中一个DONE令牌(DONE(FINAL)或DONE(批处理RPC)),该批处理指示该批处理总体上成功完成,但是没有有关单个语句的更新计数的信息。这与上面的最后一种情况类似,只是没有更新计数。那就是:我们有一个成功的结果(返回true),但是我们没有关于它的其他信息(updateCount
= -1)。 (1693年)
到达这里的唯一方法(moreResults仍然为true,但是没有任何形式的明显结果)是TDSParser实际上没有解析 任何内容
。也就是说,我们在回应中处于EOF。在那种情况下,确实没有更多结果。大功告成 (1717年)
(强调我的)
所以你们最后是对的。SQL根本无法分辨受影响的行数,默认为-1
。:)
以上是 Statement.executeUpdate()返回-1是什么意思? 的全部内容, 来源链接: utcz.com/qa/428845.html