从C#中的存储过程返回多个记录集

我不得不将ASP经典系统转换为C#

我有一个存储过程,最多可以返回7个记录集(取决于传入的参数)。

我需要知道如何简单地将所有记录集作为单独的DataTable返回,以便我可以遍历那里的任何内容,当我到达它的末尾时跳到下一个DataTable而不必运行多个SQL语句并使用多个适配器。填充语句以将每个表添加到DataSet中。

在经典中它是一个简单的Do While而不是objRS.EOF循环与objRS.NextRecordset()当我到达循环结束时移动到下一个语句。

有什么我可以使用,不需要完全重写当前的后端代码?

每个记录集具有不同数量的列和行。 他们彼此无关。 我们从Stored Proc’s返回多个记录集以减少流量。

例子很好。

谢谢

SqlConnection con=new SqlConnection("YourConnection String"); SqlCommand cmd=new SqlCommand(); SqlDataAdapter da=new SqlDataAdapter(); DataSet ds = new DataSet(); cmd = new SqlCommand("name of your Stored Procedure", con); cmd.CommandType = CommandType.StoredProcedure; //cmd.Parameters.AddWithValue("@SuperID", id);//if you have parameters. da = new SqlDataAdapter(cmd); da.Fill(ds); con.Close(); 

在此之后,您可以使用不同的(7)记录集

 ds.Tables[0] ds.Tables[1] ds.Tables[2] ds.Tables[3] ds.Tables[4] ds.Tables[5] ds.Tables[6] 

如果使用SqlDataAdapter.Fill()方法填充DataSet,则从存储过程返回的每个记录集将作为数据集中的DataTable返回

 DataSet dataset = new DataSet(); using (var adapter = new SqlDataAdapter("yourStoredProcedure", yourConnectionString)) { adapter.SelectCommand.CommandType = CommandType.StoredProcedure; adapter.Fill(dataset); } for (int i = 0; i < dataset.Tables.Count; i++) { // Do something for each recordset } 

如果您使用SqlDataReader,那么使用可以使用SqlDataReader.NextResult()方法前进到下一个记录集:

 using (var connection = new SqlConnection(yourConnectionString)) using (var command = new SqlCommand("yourStoredProcedure")) { connection.Open(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { // do something with first result set; } if (reader.NextResult()) { while (reader.Read()) { // do something with second result set; } } else { return; } if (reader.NextResult()) { while (reader.Read()) { // do something with third result set; } } else { return; } } } 

这将为您提供所需的一切

 using (SqlConnection conn = new System.Data.SqlClient.SqlConnection(connString)) { using (SqlCommand cmd = new SqlCommand()) { cmd.CommandText = "yoursp"; cmd.Connection = conn; cmd.CommandType = CommandType.StoredProcedure; conn.Open(); SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); adapter.Fill(ds); conn.Close(); } } 

你可以通过使用if (dr.NextResult())检查dr是否还有任何记录集

然后使用dr.read再次循环

试试这个

 string connStr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString; SqlConnection Con = new SqlConnection(connStr); try { string str1 = "select productid,productname from products;select VendorFName from vendor"; SqlCommand com = new SqlCommand(str1, Con); com.Connection.Open(); SqlDataReader dr = com.ExecuteReader(); DropDownList1.Items.Add("Select Product Id"); DropDownList2.Items.Add("Select Vendor Name"); while(dr.Read()) { DropDownList1.Items.Add(dr.GetValue(0).ToString()); } if (dr.NextResult()) { while (dr.Read()) { DropDownList2.Items.Add(dr.GetValue(0).ToString()); } } } catch (Exception ex) { } finally { if (Con.State == ConnectionState.Open) { Con.Close(); } }