gpt4 book ai didi

C# , SQL 更新多行

转载 作者:太空狗 更新时间:2023-10-29 17:49:47 25 4
gpt4 key购买 nike

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

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

UPDATE TableName SET Column = (some number) WHERE RowID = (some number)

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

UPDATE TableName SET Column = 5 WHERE RowID = 1000
UPDATE TableName SET Column = 10 WHERE RowID = 1001
UPDATE TableName SET Column = 30 WHERE RowID = 1002
..

我想知道我应该如何在 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
..

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

谢谢!

最佳答案

你可以使用 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);
}
}

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;

相同
UPDATE TableName SET Column = 5 WHERE RowID IN(1000,2002);

DBMS 无论如何都会一个接一个地更新所有受影响的记录,即使您编写了一个像 UPDATE table SET value=1 这样的语句,它会影响表中的每条记录。通过一批更新,您可以确保所有更新(删除、插入)都提交到数据库,而不是每个语句都进行一次往返。

关于C# , SQL 更新多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9410018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com