我在 ADO.NET 中手动编写事务代码。我正在使用的示例重用了 SqlCommand
,这看起来是个好主意。
不过,我已经在我的命令中添加了参数。
我的问题是:在下面的代码中,command.Parameters.Clear()
是否正确?还是我做错了?
using (var connection = new SqlConnection(EomAppCommon.EomAppSettings.ConnStr))
{
connection.Open();
SqlTransaction transaction = connection.BeginTransaction();
SqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
try
{
foreach (var itemIDs in this.SelectedItemIds)
{
command.CommandText = "UPDATE Item SET payment_method_id = @batchID WHERE id in (@itemIDs)";
// IS THE FOLLOWING CORRECT?
command.Parameters.Clear();
command.Parameters.Add(new SqlParameter("@batchID", batchID));
command.Parameters.Add(new SqlParameter("@itemIDs", itemIDs));
command.ExecuteNonQuery();
}
transaction.Commit();
}
catch (Exception ex)
{
MessageBox.Show("Failed to update payment batches, rolling back." + ex.Message);
try
{
transaction.Rollback();
}
catch (Exception exRollback)
{
if (!(exRollback is InvalidOperationException)) // connection closed or transaction already rolled back on the server.
{
MessageBox.Show("Failed to roll back. " + exRollback.Message);
}
}
}
}
最佳答案
由于您重复执行相同的查询,因此没有必要清除它们 - 您可以在循环外添加参数并在循环内填充它们。
try
{
command.CommandText = "UPDATE Item SET payment_method_id = @batchID WHERE id in (@itemIDs)";
command.Parameters.Add(new SqlParameter("@batchID", 0));
command.Parameters.Add(new SqlParameter("@itemIDs", ""));
foreach (var itemIDs in this.SelectedItemIds)
{
command.Parameters["@batchID"].Value = batchID;
command.Parameters["@itemIDs"].Value = itemIDs;
command.ExecuteNonQuery();
}
transaction.Commit();
}
备注 - you can't use parameters with IN as you've got here - 它不会起作用。
关于c# - 在事务中使用 SqlCommand 时,我应该调用 Parameters.Clear 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14374541/