SqlDataReader获取特定的ResultSet

时间:2016-06-09 14:37:42

标签: c# sqldatareader

当有一个返回多个结果的查询时,我们使用NextResult()的{​​{1}}在它们之间进行迭代。这样我们就可以顺序访问结果了。

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

我正在搜索是否有SqlDataReader或某种解决方法。

因为我被问到为什么我想要这样的事情,

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

更新13/6

虽然Jeroen Mostert answer为什么提供了深思熟虑的解释,但Think2ceCode1ce answer显示了解决方法的正确方向。评论中link的内容可以用于rdr.GetResult(1)方式的其他dataset工具。恕我直言,如果要编写一般解决方案,这将是一条路。但是在我的情况下,我的解决方案基于我的数据的性质和它们背后的逻辑。简而言之,(1)我使用async按顺序读取数据; (2)我在字典和集合中存储了我需要的一些数据,当我在行中读取第一行但在逻辑ResultSet中读取第二行时; (3)当我正在读取行中的第三行时,但是首先在逻辑ResultSet中我正在迭代我之前构建的集合并且基于字典数据我正在构建我的最终结果。

最终代码似乎更有效,并且比使用SqlDataReader更易于维护。但是,根据我的数据,这是一个非常具体的解决方案。

2 个答案:

答案 0 :(得分:3)

  

提供从SQL读取仅向前行的流的方法   服务器数据库。

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

答案 1 :(得分:2)

不,这是不可能的。原因很简单:如果批处理返回多个结果,它必须按顺序返回它们 - 返回结果集#2的语句在返回结果集#1的语句之前不运行,客户端也没有任何方式说"请完全跳过第一个声明" (因为这可能对批次整体产生可怕的后果)。实际上,通常没有任何方法可以告诉批处理将产生多少结果集 - 所有这些都是在运行时完成的,服务器事先并不知道会发生什么。

由于无法在服务器端跳过或索引结果集,因此在客户端也没有任何有意义的方法。您可以自由地忽略流式传输给您的结果集,但您仍然必须按顺序处理它们才能继续前进 - 一旦您继续前进,您就无法返回。

有两种可能的全球解决方法:

  • 如果您处理所有数据并在本地缓存(例如DataAdapter),您可以根据需要在数据中来回切换,但这需要将所有数据保存在内存中。
  • 如果启用MARS(多个活动结果集),即使第一个查询仍处理,您也可以执行另一个查询。这确实需要将您现有的单个批处理代码拆分为单独的语句(如果您真的无法改变SQL的任何内容,则不是一个选项),但您可以随意浏览结果集(无需缓存) )。你仍然不可能回到"但是,在一个结果集中。