C#:通过 ADO.NET 在 SQL Server 2008 上运行事务

Posted

技术标签:

【中文标题】C#:通过 ADO.NET 在 SQL Server 2008 上运行事务【英文标题】:C#: Running a transaction on SQL Server 2008 via ADO.NET 【发布时间】:2012-08-15 14:30:55 【问题描述】:

使用以下方法,我可以使用 ADO.NET 对 Oracle 数据库运行事务。当我在 SQL Server 数据库上尝试相同的代码时,我得到了显示的错误。这是什么原因造成的,如何解决?

错误:

ExecuteNonQuery 要求命令有一个事务,当 分配给命令的连接处于挂起的本地事务中。 该命令的 Transaction 属性尚未初始化。

守则:

    /// <summary>
    /// A method to run transactional SQL on a database. Does not return a record set.
    /// </summary>
    /// <param name="transactions">A list of commands</param>
    /// <returns>A boolean indicator of success</returns>
    public bool ExecuteTransactionNonQuery(List<string> transactions)
    
        if (transactions == null)
        
            throw new ArgumentNullException("transactions");
        

        PrepareConnection();

        DbTransaction dbTransaction = DBFactoryDatabaseConnection.BeginTransaction();

        try
        
            foreach (var transaction in transactions)
            

                DBFactoryDatabaseCommand.CommandText = transaction;
                DBFactoryDatabaseCommand.CommandType = CommandType.Text;
                DBFactoryDatabaseCommand.ExecuteNonQuery();
            

            dbTransaction.Commit();
        
        catch(Exception ex)
        
            dbTransaction.Rollback();
            try
            
                Close();
            
            catch (Exception f)
            
                throw new Exception("Error: Transaction execute failed on the database. " + ex.Message + ". Following that the application failed to close the connection. " + f.Message + ". ExecuteTransactionNonQuery().");
            
            throw;
        
        finally
        
            dbTransaction.Dispose();
        

        return true;
    

【问题讨论】:

将 Command.Transaction 属性设置为事务。 【参考方案1】:

您需要将事务分配给命令

DBFactoryDatabaseCommand.Transaction = dbTransaction;

【讨论】:

你能在我的代码中显示该行需要放在哪里吗?我假设在分配命令文本之后?每次执行时都必须这样做吗? 它需要在DBFactoryDatabaseCommand.ExecuteNonQuery()之前。如果连接与事务相关联,那么是的,它每次都需要分配。

以上是关于C#:通过 ADO.NET 在 SQL Server 2008 上运行事务的主要内容,如果未能解决你的问题,请参考以下文章

C# 数据操作系列 - 2. ADO.NET操作

ADO.NET SQL

ADO.NET 中参数化 SQL 命令的最终形式

ADO .NET 与 SQL Server Management Studio - ADO 性能更差

如何使用 ADO 在 C# 中获得高效的 Sql Server 死锁处理?

ADO.NET和.NET的关系?