c# - SqlDataReader 获取特定的 ResultSet

标签 c# sqldatareader

当查询返回多个结果时,我们使用 SqlDataReaderNextResult() 在它们之间进行迭代。这样我们就可以按顺序访问结果。

有没有办法以随机/非顺序方式访问结果。例如先跳到第三个结果,然后跳到第一个 e.t.c

我正在搜索是否有类似 rdr.GetResult(1) 的东西,或者解决方法。

自从有人问我为什么我想要这样的东西,

  • 首先,我无权访问查询,因此我无法更改,因此在我的客户端中,我将按照服务器写入/生成结果的顺序获得结果。
  • 要处理(构建集合、实体 --> 业务逻辑)第一个,我需要第二个和第三个的信息。
  • 同样,由于修改某些代码不是一个选项,我无法以某种方式(不编写大量代码)“存储”连接信息(例如 ID),以便在后面的步骤中连接这两个结果集
  • 最“优雅”的解决方案(肯定不是唯一的)是以非顺序方式处理结果集。所以这就是为什么我要问是否有这样的方法。

13 月 6 日更新

同时 Jeroen Mostert answer原因 进行了深思熟虑的解释,Think2ceCode1ce answer显示解决方法的正确方向。 link的内容在评论中,如何利用额外的 datasetasync 方式工作。恕我直言,如果要编写通用解决方案,这将是可行的方法。但是,就我而言,我的解决方案基于数据的性质及其背后的逻辑。简而言之,(1) 我使用 SqlDataReader 按顺序读取数据; (2)当我读取行中的第一个但逻辑结果集中的第二个时,我将一些我需要的数据存储在字典和集合中; (3) 当我读取行中的第三行时,但首先在逻辑 ResultSet 中,我正在遍历我之前构建的集合,并基于我正在构建最终结果的字典数据。

最终的代码似乎比使用 async DataAdapter 更高效且更易于维护。然而,这是一个基于我的数据的非常具体的解决方案。

最佳答案

Provides a way of reading a forward-only stream of rows from a SQL Server database.

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader(v=vs.110).aspx

您需要使用 DataAdapter 进行断开连接和非顺序访问。要使用它,您只需更改一点 ADO.NET 代码。

代替

SqlDataReader sqlReader = sqlCmd.ExecuteReader();

你需要

DataTable dt = new DataTable();
SqlDataAdapter sqlAdapter = new SqlDataAdapter(sqlCmd);
sqlAdapter.Fill(dt);

如果您的 SQL 返回多个结果集,您将使用 DataSet 而不是 DataTable,然后访问结果集,如 ds.Tables[index_or_name].

https://msdn.microsoft.com/en-us/library/bh8kx08z(v=vs.110).aspx

关于c# - SqlDataReader 获取特定的 ResultSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37729000/

相关文章:

.net - DataReader 基于名称的查找 - 到底发生了什么,导致它们比循环中基于序数的查找慢得多?

c# - HTTP 删除请求

c# - 使用 Mvvmcross 进行 UITableView 分组的现代方法

SqlDataReader 在没有数据时获取行

c# - 带有列名 c# 的 SqlDataReader.GetGuid?

c# - SqlDataReader 不存在数据时尝试读取无效

c# - 为什么我得到 "No connection associated with this command"?

c# - 数据库设计头脑 Storm : Sale Prices

c# - 对数据库的查询返回空或 null 但保存数据确实有效

c# - 将默认数据库设置为用户 SQL Server (Azure)