web-dev-qa-db-fra.com

Comment remplir un DataTable à partir d'une procédure stockée

Duplicata possible:
Comment puis-je récupérer une table d'une procédure stockée vers une table de données

J'essaie de remplir ma table de données. J'ai créé un tmpABCD datatable mais j'ai besoin de le remplir avec les valeurs d'une procédure stockée. Je ne peux pas aller plus loin.

SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);
sqlcon.Open();
SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon);

DataTable dt = new DataTable("tmpABCD");

dt.Columns.Add(new DataColumn("A"));
dt.Columns.Add(new DataColumn("B"));
dt.Columns.Add(new DataColumn("C"));
dt.Columns.Add(new DataColumn("D"));
18
Rash

Vous n'avez pas besoin d'ajouter les colonnes manuellement. Utilisez simplement un DataAdapter et c'est aussi simple que:

DataTable table = new DataTable();
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
using(var cmd = new SqlCommand("usp_GetABCD", con))
using(var da = new SqlDataAdapter(cmd))
{
   cmd.CommandType = CommandType.StoredProcedure;
   da.Fill(table);
}

Notez que vous n'avez même pas besoin d'ouvrir/fermer la connexion. Cela se fera implicitement par le DataAdapter .

L'objet de connexion associé à l'instruction SELECT doit être valide, mais il n'a pas besoin d'être ouvert. Si la connexion est fermée avant l'appel de Fill, elle est ouverte pour récupérer les données, puis fermée. Si la connexion est ouverte avant l'appel de Fill, elle reste ouverte.

49
Tim Schmelter

Utilisez un SqlDataAdapter à la place, c'est beaucoup plus facile et vous n'avez pas besoin de définir les noms de colonne vous-même, il obtiendra les noms de colonne à partir des résultats de la requête:

using (SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
{
    using (SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        using (SqlDataAdapter da = new SqlDataAdapter(cmd))
        {
            DataTable dt = new DataTable();

            da.Fill(dt);
        }
    }
}
13
Sean Airey

Vous pouvez utiliser un SqlDataAdapter:

    SqlDataAdapter adapter = new SqlDataAdapter();
    SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon);
    cmd.CommandType = CommandType.StoredProcedure;
    adapter.SelectCommand = cmd;
    DataTable dt = new DataTable();
    adapter.Fill(dt);
2
BFree

Utilisez le SqlDataAdapter, cela simplifierait tout.

//Your code to this point
DataTable dt = new DataTable();

using(var cmd = new SqlCommand("usp_GetABCD", sqlcon))
{
  using(var da = new SqlDataAdapter(cmd))
  {
      da.Fill(dt):
  }
}

et votre DataTable aura les informations que vous recherchez, tant que votre procédure stockée renvoie un ensemble de données (curseur).

2
iMortalitySX