【问题标题】:The Transaction property of the command has not been initialized该命令的 Transaction 属性尚未初始化
【发布时间】:2016-05-23 06:07:50
【问题描述】:

我正在尝试使用事务运行 ExecuteNonQuery,但我不断收到此错误

OleDbException : ExecuteNonQuery 要求命令具有 当分配给命令的连接在一个 待处理的本地事务。命令的事务属性 尚未初始化。

这是我的代码:有什么问题?

 _dataManager = new DataManager();

        bool bTrance = false;
        _dataManager.BuildConnectionString("server", "MyId", "MyPwd");
        _dataManager.Connect();

        try
        {
            Console.WriteLine("Begin Trans");
            var res = _dataManager.BeginTransaction();              
            if (res)
            {
                bTrance = true;
                Console.WriteLine(" Trans Success");
            }
            Console.WriteLine("Query Executed");
            return _dataManager.ExecuteQuery("call SP_MySp");

        }
        catch (OleDbException objDBExc)
        {
            Console.WriteLine("OleDbException : " + objDBExc.Message);
            if (bTrance)
            {

                _dataManager.RollbackTransaction();

            }

            return false;
        }
        catch (Exception objExc)
        {
            Console.WriteLine("OleDbException : " + objExc.Message);
            if (bTrance)
            {
                bTrance = false;
                _dataManager.RollbackTransaction();

            }

            return false;
        }
        finally
        {
            Console.WriteLine("Done!");
            if (bTrance)
            {
                _dataManager.CommitTransaction();

            }
        }

 public class DataManager
{


    private OleDbConnectionStringBuilder dbConnStr;
    private OleDbConnection dbConn;
    private OleDbTransaction dbTransaction;
    private OleDbCommand dbCommand;
    private bool beginTransaction;


 public bool BeginTransaction()
    {
        try
        {

            if (beginTransaction == false)
            {
                dbTransaction = dbConn.BeginTransaction();
                dbCommand.Transaction = dbTransaction;
                beginTransaction = true;
            }
            else
                dbCommand.Transaction = dbTransaction;
        }
        catch (Exception)
        {
            throw;
        }

        return beginTransaction;
    }

 public bool ExecuteQuery(string command)
    {
        try
        {   
            dbCommand.ExecuteNonQuery();
        }
        catch (OleDbException objDbEx)
        {

            throw;
        }
        catch (Exception objEx)
        {

            throw;
        }

        dbCommand.Parameters.Clear();
        dbCommand.Connection = null;

        return true;
    }

}

【问题讨论】:

  • 让框架处理细节要容易得多:using (var tx = new TransactionScope()) { your DB code goes here }。在块的末尾调用tx.Commit(),除非你想回滚。
  • Datamanager 类代码实际上属于一个 DLL。它被许多其他应用程序使用。

标签: c# transactions ado.net executenonquery


【解决方案1】:

调用SqlConnection对象的BeginTransaction方法来标记事务的开始。 BeginTransaction 方法返回对事务的引用。此引用分配给事务中登记的 SqlCommand 对象。

将 Transaction 对象分配给要执行的 SqlCommand 的 Transaction 属性。如果在与活动事务的连接上执行命令,并且尚未将 Transaction 对象分配给 Command 对象的 Transaction 属性,则会引发异常。

执行所需的命令。

调用SqlTransaction对象的Commit方法完成事务,或者调用Rollback方法中止事务。如果在执行 Commit 或 Rollback 方法之前关闭或释放连接,则事务将回滚。

参考https://msdn.microsoft.com/en-us/library/2k2hy99x(VS.80).aspx

【讨论】:

  • 这就是我正在做的。调用 beginTransaction 然后将该事务对象分配给 dbCommand 并尝试执行NonQuery
猜你喜欢
  • 2019-12-02
  • 2021-06-21
  • 2017-03-03
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多