Java 注意,它是这样的:

Java 注意,它是这样的:,java,sql,sql-server-2008,jdbc,Java,Sql,Sql Server 2008,Jdbc,首先检查错误。(1669年) 这不是一个错误。这是一个结果集吗?(ln 1680) 不是错误或结果集。可能是T-SQL语句的结果? 即,以下情况之一: 受影响行数的正计数(来自INSERT、UPDATE或DELETE) 零表示没有受影响的行,或者语句是DDL,或者 表示语句成功的-1,但没有可用的更新计数信息(在批更新计数数组中转换为statement.SUCCESS\u no\u信息)。(1706年) 以上都没有。最后一次机会。。。进入上面的解析器,我们知道moreResults最初是正确

首先检查错误。(1669年)

  • 这不是一个错误。这是一个结果集吗?(ln 1680)

  • 不是错误或结果集。可能是T-SQL语句的结果? 即,以下情况之一:

    • 受影响行数的正计数(来自INSERT、UPDATE或DELETE)
    • 零表示没有受影响的行,或者语句是DDL,或者
    • 表示语句成功的-1,但没有可用的更新计数信息(在批更新计数数组中转换为statement.SUCCESS\u no\u信息)。(1706年)
  • 以上都没有。最后一次机会。。。进入上面的解析器,我们知道moreResults最初是正确的。如果我们得出moreResults为false,那么我们将命中一个完成标记(完成(FINAL)或完成(批处理中的RPC)),该标记指示批处理总体上成功,但没有关于单个语句更新计数的信息。这与上面的最后一种情况类似,只是没有更新计数。也就是说:我们有一个成功的结果(返回true),但是我们没有关于它的其他信息(updateCount=-1)。(1693年)

  • 到这里的唯一方法(moreResults仍然是真的,但没有任何明显的结果)是如果TDSParser没有实际解析 任何东西也就是说,我们在响应中处于EOF。在这种情况下,真的没有更多的结果了。我们结束了。(ln 1717)

  • (强调矿山)


    所以你们最后是对的。SQL无法判断有多少行受到影响,默认为
    -1
    :)

    你能给我们一段代码来说明这个吗?我很想看看你的代码。你有点不正确,当你说,
    executeUpdate(…)
    应该只返回1或0…它实际上会返回(1)SQL数据操作语言(DML)语句的行数,或者(2)0(对于不返回任何内容的SQL语句)不能是-1。executeUpdate()返回INSERT、UPDATE或DELETE语句的行数,或返回不返回代码和更正的问题的SQL语句的行数为0。@Mavrossy是的,我们使用的是SQL Server 2008。
    IF
    语句有效,代码基本上是从ManagementStudio中的一个查询中复制粘贴的,该查询在放入程序之前经过测试。
    INSERT
    语句确实有效,因为如果您在之后执行
    SELECT
    语句,则会显示该行。我的意思是“执行”如“它是否更改了数据库”而不是“它是否产生了错误”请参阅我对问题的编辑。我们从查询中得到的只是“命令成功完成”SQL Server JDBC驱动程序并不是唯一违反JDBCAPI契约的驱动程序。请参阅所有JDBC驱动程序都有。。。“标准的有趣解释”。虽然这是评论的一部分,但我相信OP指定使用的数据库是SQL Server2008@SachinTRUNCATE命令是否算作“分段表上的大规模删除”?这可能是对SQL Server JDBC驱动程序行为观察到的最有用的解释。好主意!
    // Method descriptor #401 (Lcom/microsoft/sqlserver/jdbc/SQLServerConnection;II)V
    // Stack: 5, Locals: 8
    SQLServerStatement(
      com.microsoft.sqlserver.jdbc.SQLServerConnection arg0, int arg1, int arg2) 
    throws com.microsoft.sqlserver.jdbc.SQLServerException;
    
    // [...]
    
    34 aload_0 [this]
    35 iconst_m1
    36 putfield com.microsoft.sqlserver.jdbc.SQLServerStatement.updateCount:int [27]
    
    // Method descriptor #383 ()V
    // Stack: 2, Locals: 1
    final void resetForReexecute() 
    throws com.microsoft.sqlserver.jdbc.SQLServerException;
    
    // [...]
    
    10 aload_0 [this]
    11 iconst_m1
    12 putfield com.microsoft.sqlserver.jdbc.SQLServerStatement.updateCount:int [27]
    
    // Method descriptor #383 ()V
    // Stack: 3, Locals: 3
    final void clearLastResult();
    0 aload_0 [this]
    1 iconst_m1
    2 putfield com.microsoft.sqlserver.jdbc.SQLServerStatement.updateCount:int [27]
    
    // No rows affected
    if (stmt.executeUpdate() <= 0) {
    }
    // Rows affected
    else {
    }