SqlDataReader 获取特定的 ResultSet

Ath*_*oud 1 c# sqldatareader

具有返回多个结果的查询时,我们迭代其中使用NextResult()SqlDataReader。这样我们就可以按顺序访问结果。

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

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

既然有人问我为什么要这样的东西,

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

更新 13/6

虽然Jeroen Mostert 的回答原因给出了深思熟虑的解释,但Think2ceCode1ce 的回答显示了解决方法的正确方向。评论中链接的内容如何附加dataset可以用于以某种async方式工作。恕我直言,如果要编写通用解决方案,这将是要走的路。但是,就我而言,我的解决方案基于数据的性质及其背后的逻辑。简而言之,(1)我使用顺序读取数据SqlDataReader; (2) 当我读取行中的第一个但逻辑 ResultSet 中的第二个时,我将一些我需要的数据存储在字典和集合中;(3) 当我正在阅读第三行,但首先是在逻辑 ResultSet 中,我正在遍历我之前构建的集合,并基于字典数据构建我的最终结果。

最终代码似乎比使用async DataAdapter. 但是,这是基于我的数据的非常具体的解决方案。

Nik*_*tak 5

提供一种从 SQL Server 数据库读取行的只进流的方法。

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

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

代替

SqlDataReader sqlReader = sqlCmd.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)

你需要

DataTable dt = new DataTable();
SqlDataAdapter sqlAdapter = new SqlDataAdapter(sqlCmd);
sqlAdapter.Fill(dt);
Run Code Online (Sandbox Code Playgroud)

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

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