13

我必须将 ASP 经典系统转换为 C#

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

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

在经典中,这是一个简单的 Do While not objRS.EOF 循环和 objRS.NextRecordset() 当我到达循环末尾以移动到下一个语句时。

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

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

例子会很好。

谢谢

4

4 回答 4

17
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]
于 2013-08-29T12:45:37.190 回答
10

如果使用SqlDataAdapter.Fill()Method 填充 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;
        }
    }
}
于 2013-08-29T12:31:03.853 回答
7

这将返回你所需要的一切

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();
    }
}
于 2013-08-29T12:28:27.607 回答
0

您可以通过使用检查 dr 是否有更多记录集 ot no if (dr.NextResult())

然后用 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();
    }
}
于 2013-08-29T12:40:57.883 回答