我想运行我的更新存储过程来更新表中的两列(此表还包含许多其他列)。
目前我已实施如下 -
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()。
然而,只是想知道是否有任何其他已知方式以不同的方式处理这种情况 - 我的意思是我不想在内存中加载整个表,因为它还有许多其他列数据。
请指导。
答案 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)
在一次点击中写下更改。