【问题标题】:Is it ok to dipose a DbCommand before iterating the DbDataReader在迭代 DbDataReader 之前处理 DbCommand 是否可以
【发布时间】:2011-12-12 08:30:41
【问题描述】:

我有一个简单的应用程序,需要执行某些查询来获取数据库架构信息。我写了一个简单的方法来执行一个查询并返回一个阅读器,就像这样 -

public static DbDataReader ExecuteQuery(DbConnection connection,string sql)
{
   DbCommand command = connection.CreateCommand();
   command.CommandText = sql;

   using(command)
   {
      return command.ExecuteReader();    
   }
}

调用代码会关闭连接并适当地处理阅读器和连接。

我的问题 - 在迭代阅读器之前处理命令实例(通过 using 块完成)是否可以/正确?我不希望在关闭阅读器后填充任何 OUT 参数。 ADO.NET API 对此是否有任何严格的指导方针?

【问题讨论】:

    标签: c# ado.net dispose dbdatareader


    【解决方案1】:

    当您将 using 块留在方法命令中时,如果您能够使用调用者的阅读器,则意味着它仍然可以工作。

    命令是针对连接执行语句的一种手段,但不保存任何数据,这就是它起作用的原因。只要连接打开,您就可以使用您的阅读器。

    PS。还有一个很好的 ExecuteReader 重载,它指示 Reader 在处理时直接为您关闭连接,这在像您使用命令一样在本地创建连接而不是从外部传递时很有用。

    【讨论】:

    • 这听起来有点像试错法,你能保证所有 ADO.NET 实现的读者都忽略命令的状态吗?从技术上讲,使其依赖是可能的,因为命令是唯一能够创建阅读器的对象。
    • @Davide - 是的,我知道“使用”正在处理命令,因此是问题。问题是代码似乎适用于某些驱动程序,但不是全部!
    • 不,不尝试错误方法是完成这么多数据层的方式。大多数命令对象是创建的,并且无论如何都在方法中使用或不设置,并且阅读器可以在外部访问和使用。如果这不起作用,那里会有很多损坏的 DAL!
    • 其实该命令保存的是参数值;和 out / return 参数值仅在 TDS 流的 end 更新,即当阅读器到达末尾时。所以技术上,读者确实回话命令的状态。但是,我怀疑无论哪种方式都可以正常工作。
    • Marc,如果你想读出一个参数,你肯定还在方法中,并且命令仍然在那里,因为如果你只取回阅读器,你将无法从调用方法中访问它。跨度>
    猜你喜欢
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 2011-02-10
    • 2021-12-22
    相关资源
    最近更新 更多