使用存储过程C#批量更新到数据库

时间:2011-11-29 22:24:47

标签: c# sql-server batch-updates

我想运行我的更新存储过程来更新表中的两列(此表还包含许多其他列)。

目前我已实施如下 -

foreach (Object obj in customCollection)
{
    string[] updatedValues = GetUpdatedValues(obj.Property1);

    using (SqlConnection sqlConnection = new SqlConnection(connString))
    {
         sqlConnection.Open();

         SqlParameter[] sqlParams = new SqlParameter[2];
         sqlParams[0] = new SqlParameter("@column1", SqlDbType.Float) { Value = updatedValues[0]};
         sqlParams[1] = new SqlParameter("@column2", SqlDbType.Float) { Value = updatedValues[1] };

         using (SqlCommand command = new SqlCommand("upUpdateProcedure", sqlConnection))
         {
              command.CommandType = CommandType.StoredProcedure;
              command.Parameters.AddRange(sqlParams);
              DatabaseHelper.ExecuteNonQuery(command);
         }
    }
}

因此,正如您所见,上面的代码是为集合中的每个对象调用数据库。

我浏览了几个“从C#批量更新到SQL Server”的链接,但是大多数这些链接建议在C#代码中加载表,更新表行,然后调用DataAdapter.Update()。

然而,只是想知道是否有任何其他已知方式以不同的方式处理这种情况 - 我的意思是我不想在内存中加载整个表,因为它还有许多其他列数据。

请指导。

5 个答案:

答案 0 :(得分:3)

我做的很多事情就是在一个块中将XML发送到SQL。执行比在循环中多次调用DB要好得多。

乔恩·加洛韦(Jon Galloway)有一个老人,但你可以参考一个好人here

您需要做的就是将数据或列转换为XML。如果你在课堂上有这些数据,那真的很简单。查看this extension method - 我不记得我在哪里找到了这段代码,所以我无法正确归类。

答案 1 :(得分:2)

如果您使用的是SQLServer 2008或更高版本,则可以填充DataTable,并将其作为表值参数传递给存储过程。

关于表值参数的信息: http://www.sommarskog.se/arrays-in-sql-2008.html#TVP_in_TSQL

存储过程可以像表变量一样访问table参数,因此您可以在一个块中执行更新,这有利于提高性能。

这种方法类似于Billy Coover的XML方法,但使用的是DataTable而不是XML。

答案 2 :(得分:0)

在我看来,你在做什么应该可以正常工作。或者你可以建立一个批量的'更新(每个可能有50个,100个或更多个更新),并以块的形式提交它们,但不确定这对性能有什么帮助,并且可能不太可读。

您是否遇到性能问题? customCollection中有多少项?

答案 3 :(得分:0)

是的,动态构建你的sql查询,是的,我知道它与存储过程相比性能不佳,但考虑到你的代码中所有的连接打开和关闭开销,这可能不是一个坏主意。我还注意到,在你的代码中,你试图尽快打开和关闭连接,这是一个很好的做法。但是,我发现当我为多次更新保持1个连接打开时,与多次打开和关闭连接相比,它快得多。虽然缩放可能不是很好,但因为您保持连接打开。

答案 4 :(得分:0)

从TableAdapter获取DataTable(自动生成):

FooTableAdaptor tableAdapter = new FooTableAdapter();
FooDataTable dataTable = FooTableAdaptor.MyQuery(...);

滚动浏览DataTable行进行更改 - 这只是本地的 致电

tableAdapter.Update(dataTable)  

在一次点击中写下更改。