将数据读取器与 sqltransactions 一起使用

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 路径上。

以上是关于将数据读取器与 sqltransactions 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用带有 SqlTransaction 的 using 语句?

使用 sqltransaction 插入表时选择数据

无法访问 SqlTransaction 对象以在 catch 块中回滚

SqlTransaction

CommandBuilder 和 SqlTransaction 插入/更新行

SqlConnection ,SqlTransaction,SqlCommand的常用法