c# - SqlTransaction.Commit() 之前的 SqlCommand.Dispose()?

标签 c# .net sql-server-2008 tsql

在提交事务之前处理分配给事务的命令是否有效?我自己测试了以下代码,它似乎工作正常,但这是一个相当小的例子,所以如果有人肯定知道,我正在寻找确认。

internal static void TestTransaction()
{
    try
    {
        Program.dbConnection.Open();
        using (SqlTransaction transaction = Program.dbConnection.BeginTransaction())
        {
            Boolean doRollback = false;
            for (int i = 0; i < 10; i++)
            {
                using (SqlCommand cmd = new SqlCommand("INSERT INTO [testdb].[dbo].[transactiontest] (testvalcol) VALUES (@index)", Program.dbConnection, transaction))
                {
                    cmd.Parameters.AddWithValue("@index", i);
                    try
                    {
                        cmd.ExecuteNonQuery();
                    }
                    catch (SqlException)
                    {
                        doRollback = true;
                        break;
                    }
                }
            }
            if (doRollback)
                transaction.Rollback();
            else
                transaction.Commit();
        }
    }
    finally
    {
        Program.dbConnection.Close();
    }
}

最佳答案

连接、事务和命令对象只是将命令发送到数据库的工具。一旦执行命令,数据库就会收到它。无论您之后如何处理命令对象,处理它、燃烧它或将它射向月球,这个事实都不会改变。 (只能回滚)。

您可以在一个 SqlConnection 范围内创建和处理任意数量的命令(带或不带 SqlTransaction)。您可以在一个 SqlConnection 中启动和处理任意数量的事务。要证明这一点,请参阅:

using (var conn = new SqlConnection(@"server=(local)\sql2008;database=Junk;Integrated Security=SSPI"))
{
  conn.Open();
  // Repeat this block as often as you like...
  using (var tran = conn.BeginTransaction())
  {
    using (var cmd = new SqlCommand("INSERT INTO Mess VALUES ('mess1')", conn, tran))
    {
      cmd.ExecuteNonQuery(); // Shows in Sql profiler
    }
    tran.Commit(); // Commits
  }
  using (var cmd = new SqlCommand("INSERT INTO Mess VALUES ('mess2')", conn))
  {
    cmd.ExecuteNonQuery(); // Executes and commits (implicit transaction).
  }
}

当然,对于健康的代码,您需要以正确的顺序处理所有对象。在处理 SqlConnection 之后处理命令可能会导致连接对象保留在内存中。

关于c# - SqlTransaction.Commit() 之前的 SqlCommand.Dispose()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9297650/

相关文章:

c# - 在 Windows 8.1 中如何在其他地方设置焦点时保持 SettingsFlyout 可见?

c# - 您如何知道何时通过 XML 序列化加载?

sql - 查询转换表中的SQL

c# - 在 C# 中的运行时向类型化对象添加 expando 属性

c# - 在 PropertyGrid 上设置 SelectedTab

c# - 使用 C# 的嵌入式 FTP 服务器?

delphi - 使用 Delphi 2010 在 SQL Server 2008 存储过程中分配表类型输入参数

sql - 如果选择 NULL,则保留单元格的原始值 MS SQL Server 2008

c# - ITextSharp : How to get an image embedded resource

c# - .NET:获取所有 Outlook 日历项