c# - 在事务中使用 SqlCommand 时,我应该调用 Parameters.Clear 吗?

标签 c# ado.net transactions named-parameters

我在 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/

相关文章:

c# - 从 WPF System.Windows.Shapes.Path 创建图像

asp.net-mvc-3 - MVC3 与 Npgsql 和 Entity Framework 和 .Net 框架 4

c# - 如何在泛型方法中有效地创建对象列表?

c# - 使用数据集的问题

c# - 使用手动事务和分层事务进行单元测试

c# - 在 C#/WPF 中发生特定事件时强制窗口闪烁

c# - 将字符串转换为日期时间(yyyy-mm-dd)

Android:使用 ContentResolver 时的 SQLite 事务

spring - HSQLDB/Spring 单元测试不回滚

c# - 是否可以在非静态引用的程序集中的类型上调用 Activator.CreateInstance?