从每个INSERT上的存储过程中返回受影响的行以显示在ASP.NET页面中

我有一个包含10个不同INSERTS的存储过程,是否可以将每个INSERT上受影响的行的COUNT返回到ASP.NET c#页面,这样我就可以显示查看该ASP.NET页面的客户端的存储过程进程?

在服务器端使用严重性为10的RAISERROR函数将消息发送到客户端(严重性高于10会导致exception中断过程执行,即将执行转移到CATCH块,如果有的话)。 在以下示例中,我没有添加错误编号,因此RAISERROR函数将使用默认错误编号50000。 这是一个例子:

 DECLARE @count INT = 0 DECLARE @infoMessage VARCHAR(1000) = '' -- INSERT SET @count = @@ROWCOUNT SET @infoMessage = 'Number of rows affected ' + CAST(@count AS VARCHAR(10)) RAISERROR(@infoMessage, 10, 0) WITH NOWAIT -- another INSERT SET @count = @@ROWCOUNT SET @infoMessage = 'Number of rows affected ' + CAST(@count AS VARCHAR(10)) RAISERROR(@infoMessage, 10, 0) WITH NOWAIT 

在客户端,设置适当的事件处理程序,这是一个示例:

 using (SqlConnection conn = new SqlConnection(...)) { conn.FireInfoMessageEventOnUserErrors = true; conn.InfoMessage += new SqlInfoMessageEventHandler(conn_InfoMessage); using (SqlCommand comm = new SqlCommand("dbo.sp1", conn) { CommandType = CommandType.StoredProcedure }) { conn.Open(); comm.ExecuteNonQuery(); } } static void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e) { // Process received message } 

每次插入后,使用@@ ROWCOUNT ,然后通过查询获取值。

返回最后一个语句影响的行数。 如果行数超过20亿,请使用ROWCOUNT_BIG。

样品:

 USE AdventureWorks2012; GO UPDATE HumanResources.Employee SET JobTitle = N'Executive' WHERE NationalIDNumber = 123456789 IF @@ROWCOUNT = 0 PRINT 'Warning: No rows were updated'; GO 

编辑:如何通过多个查询获得@@rowcount ? 这是一个例子:

 DECLARE @t int DECLARE @t2 int SELECT * from table1 SELECT @t=@@ROWCOUNT SELECT * from table2 SELECT @t2=@@ROWCOUNT SELECT @t,@t2' 

您需要在存储过程的开头使用以下命令:

设置NOCOUNT OFF

在这种情况下,SQL Server将在每次INSERT / UPDATE后实时向客户端发送文本消息(“X行受影响”)。 所以您只需要在软件中阅读这些消息。

以下是我在Delphi中如何使用BACKUP MS SQL命令的答案 。 对不起,我对C#的了解不够,但我想你可以用SqlCommandSqlCommand类来做。