使用含更新计数的存储过程

下载 JDBC 驱动程序

为了使用存储过程修改 SQL Server 数据库中的数据,Microsoft JDBC Driver for SQL Server 提供了 SQLServerCallableStatement 类。 通过使用 SQLServerCallableStatement 类,可以调用修改数据库中数据的存储过程,然后返回受影响的行数计数(也称为更新计数)。

使用 SQLServerCallableStatement 类构建对存储过程的调用之后,可以使用 executeexecuteUpdate 方法中的任意一个来调用此存储过程。 executeUpdate 方法将返回一个 int 值,该值包含受此存储过程影响的行数,但 execute 方法不返回此值。 如果使用 execute 方法,并且希望获得受影响的行数计数,则可以在运行存储过程后调用 getUpdateCount 方法。

注意

如果要让 JDBC 驱动程序返回所有更新计数,包括任何可能已不再使用的触发器所返回的更新计数,请将 lastUpdateCount 连接字符串属性设置为“false”。 有关 lastUpdateCount 属性的详细信息,请参阅设置连接属性

作为示例,在 AdventureWorks2022 示例数据库中创建以下表和存储过程并插入示例数据:

CREATE TABLE TestTable
   (Col1 int IDENTITY,
    Col2 varchar(50),
    Col3 int);  

CREATE PROCEDURE UpdateTestTable  
   @Col2 varchar(50),  
   @Col3 int  
AS  
BEGIN  
   UPDATE TestTable  
   SET Col2 = @Col2, Col3 = @Col3  
END;  
INSERT INTO dbo.TestTable (Col2, Col3) VALUES ('b', 10);  

在下面的示例中,将向此函数传递 AdventureWorks2022 示例数据库的开放式连接,并使用 execute 方法调用 UpdateTestTable 存储过程,然后使用 getUpdateCount 方法返回受存储过程影响的行计数。

public static void executeUpdateStoredProcedure(Connection con) {
    try(CallableStatement cstmt = con.prepareCall("{call dbo.UpdateTestTable(?, ?)}");) {
        cstmt.setString(1, "A");
        cstmt.setInt(2, 100);
        cstmt.execute();
        int count = cstmt.getUpdateCount();
        System.out.println("ROWS AFFECTED: " + count);
    }
    // Handle any errors that may have occurred.
    catch (SQLException e) {
        e.printStackTrace();
    }
}

另请参阅

结合使用语句和存储过程