SQL ExecuteNonQuery for Multiple rows
本文关键字:rows Multiple for ExecuteNonQuery SQL | 更新日期: 2023-09-27 17:51:07
我有一个表("Product_Location
"),包含以下列:
ProductID (PK), LocationID (PK), Quantity
我想从数据表中的行更新数据库中的表。如果行已经存在,则更新数量,否则插入新行。
我有以下方法更新表中的数量,如果productID和LocationID的组合存在,它只是更新,否则为该组合插入新行。代码:
public bool UpdateLocationQuantity(DataSet productLocationData,
SqlTransaction sqlTransaction)
{
try
{
bool result = true;
SqlCommand command = new SqlCommand();
//get the Transaction table which contains rows to update from dataset
DataTable table = productLocationData.Tables["Inventory_Transactions"];
//Create Command Text
string commandText = @" IF Exists (SELECT * FROM Product_Location PL
WHERE ProductID = @ProductID AND LocationID = @LocationID)
UPDATE Product_Location SET Quantity = Quantity + @Quantity
WHERE ProductID = @ProductID AND LocationID = @LocationID
ELSE
INSERT INTO Product_Location (ProductID,LocationID,Quantity)
VALUES(@ProductID,@LocationID,@quantity)";
command = new SqlCommand(commandText, this.CurrentConnection);
command.CommandType = CommandType.Text;
command.Transaction = sqlTransaction;
SqlParameterCollection paramCols = command.Parameters;
//this loop will do the update or insert for all rows in the table
// How can we optimize to only ONE CALL to database?
foreach (DataRow row in table.Rows)
{
paramCols.Clear();
paramCols.AddWithValue("@ProductID",row["ProductID"]);
paramCols.AddWithValue("@LocationID", row["LocationID"]);
paramCols.AddWithValue("@Quantity", row["Quantity"]);
result &= command.ExecuteNonQuery()>= 0;
}
return result;
}
catch
{
throw;
}
}
**我的问题是我们如何优化代码,所以只有一个调用ExecuteNonQuery来更新数据库,而不是在一个循环?请注意,我们没有使用StoredProcedure,所有应该来自c#和SQL查询或事务。
如果只是Update the rows,我们可以调用command。通过提供源表进行更新,它可以轻松地更新所有行,而无需使用行。但由于我使用'IF Exists',那么我们被迫使用ExecuteNonQuery,它不接受源表作为参数。
谢谢
除了使用ParameterCollection,您还可以这样做:
command.Parameters.Add(new SqlParameter("@ProductID", ProductData.PRODUCTID_FIELD));
或
command.Parameters.AddWithValue("@ProductID", ProductData.PRODUCTID_FIELD);
等等。您实际上不必指定类型。
然后调用:
int numOfRowsAffected = command.ExecuteNonQuery();
不返回数据集,只返回受影响的行数,因为这是一个非查询。
像你这样做的问题是你需要设置command.Parameters = paramCols;
但是命令。参数是只读的,所以不能。也就是说,只要赋值,它就是只读的。只能通过Add
和AddWithValue
方法添加参数
对于多行,在循环中添加命令
foreach (DataRow row in table.Rows)
{
SqlCommand command = new SqlCommand();
.
.
.
}