为了使用存储过程修改 SQL Server 数据库中的数据,Microsoft SQL Server JDBC Driver 提供了 SQLServerCallableStatement 类。通过使用 SQLServerCallableStatement 类,可以调用修改数据库中所包含数据的存储过程,然后返回受影响的行数计数(也称为更新计数)。
使用 SQLServerCallableStatement 类构建对存储过程的调用之后,可以使用 execute 或 executeUpdate 方法中的任意一个来调用此存储过程。executeUpdate 方法将返回一个 int 值,该值包含受此存储过程影响的行数,但 execute 方法不返回此值。如果使用 execute 方法,并且希望获得受影响的行数计数,则可以在运行存储过程后调用 getUpdateCount 方法。
注意:
如果要让 JDBC 驱动程序返回所有更新计数,包括任何可能已不再使用的触发器所返回的更新计数,请将 lastUpdateCount 连接字符串属性设置为“false”。有关 lastUpdateCount 属性的详细信息,请参阅设置连接属性。
作为示例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下表和存储过程,以及插入示例数据:
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);
在下面的示例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,并使用 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(); cstmt.close(); System.out.println("ROWS AFFECTED: " + count); } catch (Exception e) { e.printStackTrace(); } }