DataReader中的倍数表

我通常使用DataSet因为它非常灵活。 最近我被分配了代码优化任务,为了减less命中数据库,我正在改变一个程序中的两个查询。 一个查询返回count ,另一个返回actual data 。 也就是说,我的stored procedure返回两个表。 现在,我知道如何使用DataSets读取两个表,但是我需要使用DataReader读取两个表。 在寻找我发现这个 。

我按照这篇文章写这样的代码:

 dr = cmd.ExecuteReader(); while (dr.Read()) { } if (dr.NextResult()) // this line throws exception { while (dr.Read()) { 

但是我在dt.NextResult得到一个exception。 例外是:

 Invalid attempt to call NextResult when reader is closed. 

我也试图去Google上面的错误,但还是无法解决问题。 任何帮助都感激不尽。 我需要使用datareader读取多个表,这可能吗?

试试这个,因为一旦任务结束,这将closures连接,数据读取器和命令,这样就不会给datareaderclosuresexception

if(reader.NextResult())检查是否有下一个结果,

 using (SqlConnection connection = new SqlConnection("connection string here")) { using (SqlCommand command = new SqlCommand ("SELECT Column1 FROM Table1; SELECT Column2 FROM Table2", connection)) { connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { MessageBox.Show(reader.GetString(0), "Table1.Column1"); } if(reader.NextResult()) { while (reader.Read()) { MessageBox.Show(reader.GetString(0), "Table2.Column2"); } } } } } 

我试图重现这个问题(也因为我以前没有在阅读器中使用多个表)。 但它按预期工作,因此我认为你已经省略了相关的代码。

这是我的testing代码:

 using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString)) { using (var cmd = new SqlCommand("SELECT TOP 10 * FROM tabData; SELECT TOP 10 * FROM tabDataDetail;", con)) { int rowCount = 0; con.Open(); using (IDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { String object1 = String.Format("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]); } if (rdr.NextResult()) { rowCount = 0; while (rdr.Read()) { String object1 = String.Format("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]); } } } } }