【问题标题】:Using datareaders with sqltransactions将数据读取器与 sqltransactions 一起使用
【发布时间】:2012-07-12 13:53:43
【问题描述】:

我在我的代码中使用SqlTransactions 用于回滚。在事务中,我有多个要执行的语句可能包括选择插入和更新。所有这些声明都在sqltransaction 的范围内。一切正常,只针对一个问题。我将datareaders 用于选择语句。这些阅读器一旦使用就关闭。这迫使连接丢失,一切都失败了。有人对我是否可以在sqltransaction 中使用datareaders 有解决方案吗??

【问题讨论】:

    标签: c# sql transactions datareader


    【解决方案1】:

    只有在调用ExecuteReader 时设置了CommandBehavior.CloseConnection 选项时,DataReader 才会关闭连接。

    如果您避免设置此选项,应该没问题。

    【讨论】:

      【解决方案2】:

      您应该自行打开 SqlConnection。
      关闭 DataReader 时,SqlDataReader 不会关闭 SqlConnection

      例如:

      using(SqlConnection cn = GetConnection())
      {
          cn.Open();
          SqlTransaction tr = cn.BeginTransaction("myTransaction");
          .....
      
          SqlCommand command = new SqlCommand(sqlString, cn);
      
          using(SqlDataReader reader = command.ExecuteReader())
          {
              .....
          }
      
          SqlCommand command1 = new SqlCommand(sqlString1, cn);
          using(SqlDataReader reader1 = command1.ExecuteReader())
          {
              .....
          }
          tr.Commit();
      }
      

      【讨论】:

      • 您好,我不断收到这些错误消息,提示已经有一个打开的 DataReader 与此命令关联,必须先关闭。有什么办法可以解决这个问题
      • 尝试将每个数据读取器封装在using 语句中。这将保证调用数据读取器的 Close 和 Dispose。
      • 这很好...我使用了很多数据读取器>100...有什么方法可以在执行下一个读取器之前关闭连接打开的数据读取器?
      • 是的,对每个人都调用 Close,然后,只需实现 using,您就在 right practice 路径上。
      猜你喜欢
      • 1970-01-01
      • 2017-03-10
      • 2012-04-21
      • 2020-12-17
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多