在迭代 DbDataReader 之前处理 DbCommand 是不是可以

Posted

技术标签:

【中文标题】在迭代 DbDataReader 之前处理 DbCommand 是不是可以【英文标题】: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 对此是否有任何严格的指导方针?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

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

以上是关于在迭代 DbDataReader 之前处理 DbCommand 是不是可以的主要内容,如果未能解决你的问题,请参考以下文章

将 List<X> 转换为 DBDataReader

DbDataReader、NextResult() 和填充多个表

Spring Data R2DBC响应式操作MySQL

如何在 Entity Framework Core 2.0 中从 DbDataReader 转换为 Task<IEnumerable<TEntity>>?

Spring Data R2dbc中处理表之间关系的最佳实践

Flink流处理之迭代案例