5

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

4

3 回答 3

3

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

设置无计数

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

这是我的回答如何在 Delphi中执行 BACKUP MS SQL 命令。抱歉,我对 C# 的了解不够,但我想你可以在 C# 中通过SqlCommand类来做到这一点。

于 2012-12-05T10:47:41.813 回答
2

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

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
}
于 2012-12-05T10:32:41.860 回答
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'
于 2012-12-05T10:22:32.560 回答