c# - 返回已处理记录数的 SQL Server 存储过程

标签 c# sql-server stored-procedures timer return

我有一个 Winforms 应用程序,它执行一个检查多行(大约 500k)的存储过程。为了通知用户已经处理了多少行,我需要一个存储过程,它每 n 行返回一个值。例如,每处理 1000 行(大多数是 INSERT)。

否则我只能在处理完所有行时通知我。任何提示如何解决这个问题?

我认为使用触发器或某些计划任务可能会有用,但我不知道如何实现它。

最佳答案

所以这是一个非常有趣的问题。我大约 5 年前尝试过但没有成功,所以这对我来说是一个小挑战 :) 好吧,这就是我为你准备的。

要从 SQL Server 发送消息,您需要使用带有 nowait 选项的 raiserror 命令。所以我写了一个存储过程

create procedure sp_test
as
begin
    declare @i bigint, @m nvarchar(max)

     select @i = 1

     while @i < 10
     begin
         waitfor delay '00:00:01'
         select @m = cast(@i as nvarchar(max))
         raiserror(@m, 0, 0) with nowait
         select @i = @i + 1
     end
end

如果您尝试在 SSMS 中执行它,您会看到该消息出现在消息部分,而过程仍然有效。好的,我们收到来自服务器的消息。现在我们需要在客户端进行处理。

为此,我创建了一个这样的 SQLCommand

SqlCommand cmd = new SqlCommand("sp_Test");
cmd.Connection = new SqlConnection("Server=HOME;Database=Test;Trusted_Connection=True;");

现在我们使用 SqlConnection 对象的 InfoMessage 来捕获消息:

cmd.Connection.InfoMessage += Connection_InfoMessage;

static void Connection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    Console.WriteLine(e.Message);
}

现在我们正在尝试显示消息

cmd.Connection.Open();
try
{
    SqlDataReader r = cmd.ExecuteReader();
}
finally
{
    cmd.Connection.Close();
}

成功:)

顺便说一句,您不能使用 ExecuteNonQuery(),因为它会在执行结束时返回串联的消息。 此外,您可能希望在后台模式下运行查询,这样它就不会锁定您的 winform 客户端。

关于c# - 返回已处理记录数的 SQL Server 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12996705/

相关文章:

mysql - 从 MySql 查询 SQL Server 数据库?

mysql - 使用 MySQL 服务器端准备语句来提高应用程序性能

Oracle Apex : How to execute procedure and display the results on a page

c# - Mapster - 将不可为空类型映射到可为空类型

c# - 我应该测试 UDP 服务器代码吗?如果是,为什么以及如何测试?

sql-server - SQL Server - 使用排序规则

mysql - 不更新表行的过程

c# - 发布到发送 NULL 值的 WCF 服务

c# - 的正确名称是什么??运算符(operator)?

c# - 解决 SQL 事务超时的防弹方法