使用含更新计数的存储过程
为了使用存储过程修改 SQL Server 数据库中的数据,Microsoft JDBC Driver for SQL Server 提供了 SQLServerCallableStatement 类。 通过使用 SQLServerCallableStatement 类,可以调用修改数据库中数据的存储过程,然后返回受影响的行数计数(也称为更新计数)。
使用 SQLServerCallableStatement 类构建对存储过程的调用之后,可以使用 execute 或 executeUpdate 方法中的任意一个来调用此存储过程。 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();
}
}