gpt4 book ai didi

C# - 批量执行存储过程

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:43 24 4
gpt4 key购买 nike

我目前有一个使用 C# 编写的 WinForms 应用程序。

我们所有的更新都是通过执行存储过程完成的。我们在一个屏幕上有一个情况,该屏幕上调用了多达 60 个更新。目前,每个更新调用都被一个接一个地处理,一些客户端和服务器之间的连接速度较慢的客户端遇到了速度问题。我很确定,如果我可以一次将所有这些调用发送到数据库,它将在客户端节省大量等待时间(目前对于这 60 个调用中的每一个,调用 ExecuteNonQuery 并且客户端等待true/false 结果,然后继续,这会导致延迟)。

将所有这些调用捆绑到一个 SQL 调用中的最佳方法是什么?正在考虑将所有代码放入事务中,但需要尽可能避免锁定,因为在任何给定点都有许多并发用户使用系统。

编辑:存储过程的目的实际上是更新服务器上的记录。我们甚至不需要正在执行的存储过程的任何响应。本质上,我想将下面代码的一堆调用捆绑到一个调用中,想知道这样做的最佳方法是什么

        public virtual bool Update(DataRow dataRow, Guid userId)
{
SqlCommand cm = null;
bool ret = true;
try
{
cm = Utilities.GetSqlUpdateCommand(dataRow, userId);
ExecuteNonQuery(cm);
}
catch (SqlException ex)
{
LogDataAccessBaseError(ex);
ret = false;
throw;
}
finally
{
if (cm != null)
{
cm.Dispose();
}
}

return ret;
}

最佳答案

您使用的是 SQL Server 2008 或更高版本吗?所有存储过程调用是否相同(除了个别参数)?

如果是这样,您可能会考虑创建一个采用 Table-Valued Parameter 的存储过程版本(ADO)。这将允许您将所有行作为单个表传递到 SQL Server。


如果不是,那么我假设 GetSqlUpdateCommand 当前正在使用存储过程名称构建一个 SqlCommand 并添加适当的参数。一种不同的方法是:

更改 GetSqlUpdateCommand 以便它可以接受现有的 SqlCommand 对象。然后附加一个新的 exec StoredProcedure @Parm1,@Parm2,@Parm2 调用,并添加这些参数。它需要确保它为其添加的参数使用新名称,以便它不会与其他 exec 调用发生冲突。您可能还需要调整此功能,以便它可以检测到您何时接近可以传递的参数数量限制,此时它应该执行此命令,然后创建一个新命令。

例如它构建了一个文本命令,如:

exec MegaProcedure @Parm1,@Parm2,@Parm3
exec MegaProcedure @Parm4,@Parm5,@Parm6
exec MegaProcedure @Parm7,@Parm8,@Parm9

最后,我认为您不了解事务是什么/做什么 - 它们不会神奇地将多个调用绑定(bind)在一起,因此它们以更少的开销/往返时间执行。它们纯粹是一种可以回滚工作的机制,因此它们在这里无济于事。

(而且,事实上,SQL 中的每个语句无论如何都在一个事务中运行——只是默认情况下,该事务在语句开始时自动打开,并在语句成功完成时提交)

关于C# - 批量执行存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8238414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com