当有一个返回多个结果的查询时,我们使用NextResult()
的{{1}}在它们之间进行迭代。这样我们就可以顺序访问结果了。
有没有办法以随机/非顺序的方式访问结果。例如,首先跳到第三个结果,然后跳到第一个e.t.c
我正在搜索是否有SqlDataReader
或某种解决方法。
因为我被问到为什么我想要这样的事情,
更新13/6
虽然Jeroen Mostert answer对为什么提供了深思熟虑的解释,但Think2ceCode1ce answer显示了解决方法的正确方向。评论中link的内容可以用于rdr.GetResult(1)
方式的其他dataset
工具。恕我直言,如果要编写一般解决方案,这将是一条路。但是在我的情况下,我的解决方案基于我的数据的性质和它们背后的逻辑。简而言之,(1)我使用async
按顺序读取数据; (2)我在字典和集合中存储了我需要的一些数据,当我在行中读取第一行但在逻辑ResultSet中读取第二行时; (3)当我正在读取行中的第三行时,但是首先在逻辑ResultSet中我正在迭代我之前构建的集合并且基于字典数据我正在构建我的最终结果。
最终代码似乎更有效,并且比使用SqlDataReader
更易于维护。但是,根据我的数据,这是一个非常具体的解决方案。
答案 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
),您可以根据需要在数据中来回切换,但这需要将所有数据保存在内存中。