3

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

目前我已经实现如下 -

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()。

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

请指导。

4

5 回答 5

3

我经常做的一件事是将 XML 以一个块的形式发送到 SQL。比在循环中多次调用数据库执行得更好。

Jon Galloway 有一个老歌,但你可以参考这里的好歌。

您需要做的就是将数据或列转换为 XML。如果你在一个类中有这些数据,那真的很简单。看看这个扩展方法——我不记得我在哪里找到了这个代码,所以我无法正确地归因它。

于 2011-11-29T22:34:54.220 回答
2

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

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

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

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

于 2011-11-29T23:23:11.403 回答
0

在我看来,您正在做的事情应该可以正常工作。或者,您可以构建一个“批次”更新(每个可能有 50、100 或更多更新),并将它们全部提交,但不确定这是否有助于提高性能,并且可能会降低可读性。

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

于 2011-11-29T22:28:42.577 回答
0

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

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

滚动浏览进行更改的 DataTable 行 - 这只是本地的。
称呼

tableAdapter.Update(dataTable)  

一键写入更改。

于 2011-11-30T00:30:35.507 回答
0

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

于 2011-11-29T22:43:01.297 回答