您可以使用DataTable来存储记录,插入、删除或更改行,并通过使用SqlDataAdapter的UpdateBatchSize将所有更改一次性更新(0表示没有限制):
public static void BatchUpdate(DataTable dataTable,Int32 batchSize)
{
string connectionString = GetConnectionString();
using (SqlConnection connection = new
SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.UpdateCommand = new SqlCommand(
"UPDATE Production.ProductCategory SET "
+ "Name=@Name WHERE ProductCategoryID=@ProdCatID;",
connection);
adapter.UpdateCommand.Parameters.Add("@Name",
SqlDbType.NVarChar, 50, "Name");
adapter.UpdateCommand.Parameters.Add("@ProdCatID",
SqlDbType.Int, 4, "ProductCategoryID");
adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
adapter.InsertCommand = new SqlCommand(
"INSERT INTO Production.ProductCategory (Name) VALUES (@Name);",
connection);
adapter.InsertCommand.Parameters.Add("@Name",
SqlDbType.NVarChar, 50, "Name");
adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
adapter.DeleteCommand = new SqlCommand(
"DELETE FROM Production.ProductCategory "
+ "WHERE ProductCategoryID=@ProdCatID;", connection);
adapter.DeleteCommand.Parameters.Add("@ProdCatID",
SqlDbType.Int, 4, "ProductCategoryID");
adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;
adapter.UpdateBatchSize = batchSize;
adapter.Update(dataTable);
}
}
http://msdn.microsoft.com/zh-cn/library/aadf8fk2.aspx
我猜您可能对数据库管理系统内部的工作方式存在误解。这
UPDATE TableName SET Column = 5 WHERE RowID = 1000;
UPDATE TableName SET Column = 5 WHERE RowID = 1002;
是相同的意思
UPDATE TableName SET Column = 5 WHERE RowID IN(1000,2002);
即使您编写了像UPDATE table SET value=1
这样会影响表中每条记录的语句,DBMS仍将逐一更新所有受影响的记录。通过批量更新,您可以确保所有更新(删除、插入)都提交到数据库,而不是为每个语句进行一次往返。
MERGE
语句。 - Damien_The_Unbeliever