减少数据库调用次数

时间:2013-09-16 15:51:09

标签: c# .net winforms sql-server-2008

我有一个stored-procedure,它接受​​五个参数并在表格上执行更新

Update Table
Set field = @Field
Where col1= @Para1 and Col2=@Para and Col3=@Para3 and col4 =@aPara4

从用户角度来看,您可以为所有条件参数选择多个值。 例如,您可以选择2个需要匹配数据库表中 Col1 的选项(需要传递为 @ Para1

所以我将所有选定的值存储在分隔列表中。

目前我正在使用foreach循环进行更新

  foreach (var g in _list1)
            {
                foreach (var o in _list2)
                {
                    foreach (var l in _list3)
                    {
                        foreach (var a in _list4)
                        {
                           UpdateData(g, o, l,a);
                        }
                    }
                }
            }

我确信这不是一个很好的方法,因为这会调用数据库调用次数。有什么方法可以忽略循环并进行最少数量的db调用来实现相同的结果吗?

更新

我正在寻找除Table-Valued Parameters

之外的其他方法

6 个答案:

答案 0 :(得分:1)

一种可能的方法是使用Table-Valued Parameters将每个条件的多个值传递给存储过程。这会减少代码中的循环,并且仍然应该提供您正在寻找的功能。

如果我没有弄错,他们是在SQL Server 2008中引入的,所以只要您不必支持2005或更早版本,就可以使用它们。

答案 1 :(得分:1)

考虑使用Enterprise Library中的MS Data Access Application Block来获取UpdateDataSet命令。

基本上,您将构建一个数据表,其中每一行都是参数集,然后针对打开的连接执行参数集的“批处理”。

当然,你可以通过构建一个包含多个更新命令的字符串并对数据库执行它来完成相同的操作。

答案 2 :(得分:1)

由于表值参数不受限制,您可以考虑使用基于XML的方法:

  • 构建一个包含您希望传递的四列的XML文档。
  • 更改存储过程的签名以接受单个XML值参数而不是四个标量参数
  • 更改存储过程的代码,以根据您获得的XML执行更新
  • 使用四个嵌套循环,使用您在内存中构造的XML调用新的存储过程。

这应该减少往返次数,并加快整体执行时间。这是一个link to an article,解释了如何使用XML一次插入多行;你的情况有点类似,所以你应该能够使用那篇文章中概述的方法。

答案 3 :(得分:1)

您可以将查询带到此表单:

Update Table Set field = @Field Where col1 IN {} and Col2 IN {} and Col3 IN {} and col4 IN {}

以这种方式传递参数:https://stackoverflow.com/a/337792/580053

答案 4 :(得分:0)

只要您可以自由更新存储过程的结构;我建议的方法是使用表值参数而不是多个参数。

可以在以下位置找到服务器和数据库代码的一个很好的示例:http://www.codeproject.com/Articles/39161/C-and-Table-Value-Parameters

答案 5 :(得分:0)

为什么要使用存储过程?在我看来,你不应该使用SP来做简单的CRUD操作。存储过程的真正威力在于繁重的计算和类似的事情。

表值参数将是我的选择,但由于您正在寻找其他方法,为什么不采用更简单的方法,只需在服务器端代码上动态构建批量/大量更新查询并针对数据库运行它?