当查询返回多个结果时,我们使用 SqlDataReader
的 NextResult()
在它们之间进行迭代。这样我们就可以按顺序访问结果。
有没有办法以随机/非顺序方式访问结果。例如先跳到第三个结果,然后跳到第一个 e.t.c
我正在搜索是否有类似 rdr.GetResult(1)
的东西,或者解决方法。
自从有人问我为什么我想要这样的东西,
- 首先,我无权访问查询,因此我无法更改,因此在我的客户端中,我将按照服务器写入/生成结果的顺序获得结果。
- 要处理(构建集合、实体 --> 业务逻辑)第一个,我需要第二个和第三个的信息。
- 同样,由于修改某些代码不是一个选项,我无法以某种方式(不编写大量代码)“存储”连接信息(例如 ID),以便在后面的步骤中连接这两个结果集
- 最“优雅”的解决方案(肯定不是唯一的)是以非顺序方式处理结果集。所以这就是为什么我要问是否有这样的方法。
13 月 6 日更新
同时 Jeroen Mostert answer对原因 进行了深思熟虑的解释,Think2ceCode1ce answer显示解决方法的正确方向。 link的内容在评论中,如何利用额外的 dataset
以 async
方式工作。恕我直言,如果要编写通用解决方案,这将是可行的方法。但是,就我而言,我的解决方案基于数据的性质及其背后的逻辑。简而言之,(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/