C#,SQL更新多行

Pop*_*oko 9 c# sql

我有一个关于通过SQL更新多行的有效方法的问题.

基本上,我有一个查询,我需要在不同的RowID上运行:

UPDATE TableName SET Column = (some number) WHERE RowID = (some number)
Run Code Online (Sandbox Code Playgroud)

如果更具体,这是一个更好的例子:

UPDATE TableName SET Column = 5 WHERE RowID = 1000
UPDATE TableName SET Column = 10 WHERE RowID = 1001
UPDATE TableName SET Column = 30 WHERE RowID = 1002
..
Run Code Online (Sandbox Code Playgroud)

我想知道我应该如何在C#上构建更新查询命令(或者只是给我一个我应该得到的结果查询的例子)所以一旦我使用ExecuteQuery,它将在一个部分运行所有这些命令而不是执行每个命令.

编辑: 我有另一个问题,你能解释一下动态情况,其中不一定有我想要更新的行已经存在,在这种情况下我需要插入而不是更新.更好地解释,回到我的例子让我说我想做

UPDATE TableName SET Column = 5 WHERE RowID = 1000
INSERT INTO TableName [RowID, Column] VALUES (1001, 20)
UPDATE TableName SET Column = 30 WHERE RowID = 1002
..
Run Code Online (Sandbox Code Playgroud)

这意味着我需要检查行是否存在,如果是,我会使用更新,否则我将不得不插入它.

谢谢!

Tim*_*ter 9

您可以使用DataTable来存储记录,插入,删除或更改行,并使用SqlDataAdapter的UpdateBatchSize更新所有更改(0表示无限制):

public static void BatchUpdate(DataTable dataTable,Int32 batchSize)
{
    // Assumes GetConnectionString() returns a valid connection string.
    string connectionString = GetConnectionString();

    // Connect to the AdventureWorks database.
    using (SqlConnection connection = new 
      SqlConnection(connectionString))
    {

        // Create a SqlDataAdapter.
        SqlDataAdapter adapter = new SqlDataAdapter();

        // Set the UPDATE command and parameters.
        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;

        // Set the INSERT command and parameter.
        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;

        // Set the DELETE command and parameter.
        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;

        // Set the batch size.
        adapter.UpdateBatchSize = batchSize;

        // Execute the update.
        adapter.Update(dataTable);
    }
}
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/aadf8fk2​​.aspx

我假设你误解了dbms如何在内部工作.这个

UPDATE TableName SET Column = 5 WHERE RowID = 1000;
UPDATE TableName SET Column = 5 WHERE RowID = 1002;
Run Code Online (Sandbox Code Playgroud)

是相同的

UPDATE TableName SET Column = 5 WHERE RowID IN(1000,2002);
Run Code Online (Sandbox Code Playgroud)

无论如何,dbms将逐个更新所有受影响的记录,即使您要写一个UPDATE table SET value=1会影响表中每条记录的语句.通过在一个批处理中更新,您可以确保将所有更新(删除,插入)提交到数据库,而不是每个语句都进行一次往返.