从C#中的存储过程返回多个记录集
本文关键字:记录 返回 存储过程 | 更新日期: 2023-09-27 18:29:25
我不得不将ASP经典系统转换为C#
我有一个存储过程,它最多可以返回7个记录集(取决于传入的参数)。
我需要知道如何简单地将所有记录集作为单独的DataTables返回,这样我就可以遍历其中的任何内容,当我到达下一个DataTable的末尾时跳到它,而不必运行多个SQL语句和使用多个适配器。Fill语句将每个表添加到数据集中。
在经典的循环中,当我到达循环的末尾移动到下一个语句时,它是一个简单的Do While not objRS.EOF循环,带有objRS.NextRecordset()。
有什么东西我可以使用,而不需要完全重写当前的后端代码吗?
每个记录集都有不同数量的列和行。它们彼此无关。我们从存储过程返回多个记录集以减少流量。
举个例子就好了。
感谢
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()
方法填充数据集,则从存储过程返回的每个记录集都将作为数据集中的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();
}
}