Java 注意,它是这样的:
首先检查错误。(1669年)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最初是正确
- 受影响行数的正计数(来自INSERT、UPDATE或DELETE)
- 零表示没有受影响的行,或者语句是DDL,或者
- 表示语句成功的-1,但没有可用的更新计数信息(在批更新计数数组中转换为statement.SUCCESS\u no\u信息)。(1706年)
所以你们最后是对的。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 {
}