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



我想运行我的update存储过程来更新一个表中的两个列(这个表也有许多其他列)。

目前我已经实现如下-

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);
         }
    }
}
因此,正如您所看到的,上面的代码正在为集合中的每个对象调用database。

我浏览了一些关于"从c#批量更新到SQL Server"的链接,但大多数链接都建议在c#代码中加载表,更新表行,然后调用DataAdapter.Update()。

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

请导游。

我经常做的一件事是在一个块中将XML发送给SQL。比在一个循环中多次调用DB要好得多。

Jon Galloway有一个老的但很好的例子,你可以参考一下。

您所需要做的就是将数据或列转换为XML。如果你在类中有这些数据,那就很简单了。检查这个扩展方法-我不记得我在哪里找到这个代码,所以我不能正确地赋予它属性。

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

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

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

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

在我看来,你所做的应该很好。或者,你可以构建一个"批处理"的更新(可能每个更新50、100或更多),并以块的形式提交它们,但不确定这是否有助于提高性能,而且可能会降低可读性。

你有性能问题吗?customCollection中有多少项?

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

从TableAdapter(自动生成)中获取数据表:

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

滚动行数据表进行更改-这只是局部的。

tableAdapter.Update(dataTable)  

相关内容

  • 没有找到相关文章

最新更新