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

时间:2012-12-05 10:11:52

标签: c# asp.net sql-server sql-server-2008

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

3 个答案:

答案 0 :(得分:3)

在服务器端使用严重性为10的RAISERROR函数将消息发送到客户端(严重性高于10会导致异常中断过程执行,即将执行转移到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
}

答案 1 :(得分:2)

每次插入后,使用@@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'

答案 2 :(得分:2)

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

SET NOCOUNT OFF

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

这是BACKUP MS SQL命令的my answer how to do it in Delphi。对不起,我对C#的了解不够,但我想你可以用SqlCommand课程在C#中完成。