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"));
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.
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);
}
}
}
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);
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).