web-dev-qa-db-fra.com

Renvoyer plusieurs jeux d'enregistrements à partir de proc stockés en C #

Je dois convertir un système ASP classic en C #

J'ai une procédure stockée qui peut renvoyer jusqu'à 7 jeux d'enregistrements (en fonction des paramètres passés).

J'ai besoin de savoir comment je peux simplement renvoyer tous les jeux d'enregistrements en tant que DataTables individuels afin de pouvoir parcourir tout ce qui se trouve là-bas, en passant au prochain DataTable lorsque je l'aurai terminé sans avoir à exécuter plusieurs instructions SQL et à utiliser plusieurs adaptateurs. Remplissez les instructions pour ajouter chaque table dans un DataSet.

En classique, c’était une simple boucle Do While not objRS.EOF avec un objRS.NextRecordset () lorsque je suis arrivé à la fin de la boucle pour passer à l’instruction suivante.

Y a-t-il quelque chose que je puisse utiliser qui n'exige pas une réécriture totale du code back-end actuel?

Chaque jeu d'enregistrements a un nombre différent de colonnes et de lignes. Ils ne sont pas liés les uns aux autres. Nous renvoyons plusieurs jeux d'enregistrements de Stored Proc pour réduire le trafic.

Les exemples seraient Nice.

Merci

10
user2334626
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();

Après cela, vous pourrez tirer parti de différents (7) jeux d’enregistrements en utilisant

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

Si vous remplissez un DataSet à l'aide de la méthode SqlDataAdapter.Fill(), chacun de vos jeux d'enregistrements renvoyés à partir de la procédure stockée sera renvoyé en tant que DataTable dans votre ensemble de données.

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
}

Si vous utilisez un SqlDataReader, vous pouvez utiliser la méthode SqlDataReader.NextResult() pour passer au jeu d'enregistrements suivant:

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;
        }
    }
}
9
GarethD

cela vous retournera tout ce dont vous avez besoin

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();
    }
}
5
Ehsan

vous pouvez vérifier si dr a plus de jeu d'enregistrements non à l'aide deif (dr.NextResult())

puis boucle à nouveau avec dr.read

essaye ça

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();
    }
}
0
Dhaval