C# - 批量执行存储过程

标签 c# sql stored-procedures

我目前有一个使用 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/

相关文章:

sql-server - 如何从链接服务器查看SQL Server存储过程?

sql - 触发器、存储过程与 DAL 中的内联 SQL 用于更新具有历史记录的数据库中的表

sql - SQL查询选择最大/最小的选定的标识符(某种为每个?)

mysql - 如何在 Groovy 中收集 sql 行

带有两个选择语句的 PostgreSQLFunction

c# - 我可以使用 Word 2003 组件通过 C# 将 .doc 文件转换为 .pdf 吗?

c# - Datagridview:如何将单元格设置为编辑模式?

c# - 在Windows Vista/XP中重定向声音

c# - 在 LINQ to SQL 中查找或创建对象的通用方法?

python - 改进SQL INSERT查询以避免sql注入(inject)