我有一个WinForms应用程序执行存储过程会检查若干行(约50万)。 为了告知有多少行已经处理的用户,我需要一个存储过程返回一个值每n行。 例如,处理每行1000(最是INSERT
)。
否则,我就可以,只有当所有行都被处理通知。 任何提示如何解决此问题?
我想这可能是使用触发器或某些计划的任务是有用的,但我不能想出如何实现它。
我有一个WinForms应用程序执行存储过程会检查若干行(约50万)。 为了告知有多少行已经处理的用户,我需要一个存储过程返回一个值每n行。 例如,处理每行1000(最是INSERT
)。
否则,我就可以,只有当所有行都被处理通知。 任何提示如何解决此问题?
我想这可能是使用触发器或某些计划的任务是有用的,但我不能想出如何实现它。
因此,这是非常有趣的问题。 我没有成功尝试过了大约5年前,所以这是一个小的挑战对我来说:)那么,这里的就是我要告诉你。
若要从SQL Server发送消息,则需要使用raiserror
命令nowait
选项。 所以我写了一个存储过程
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;");
现在赶上我们使用的消息InfoMessage
SqlConnection对象的:
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客户端。