C# ADO.NET : remplir un DataSet en appelant une procédure stockée avec SqlDataAdapter
Dans la section précédente, nous utilisions SqlDataReader pour une lecture en flux, avant‑lecture seule. Ici, nous nous servons de SqlDataAdapter pour charger d’un coup les résultats d’une procédure stockée dans un DataSet (table de données hors‑connexion en mémoire). C’est très utilisé pour lier directement des contrôles comme DataGridView.SqlCommand (définir la procédure stockée) → SqlDataAdapter.SelectCommand → adapter.Fill(DataSet) récupère les données automatiquement
Exemple
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
sqlCom.CommandText = "myProc";
// Indiquer qu’on exécute une procédure stockée
sqlCom.CommandType = CommandType.StoredProcedure;
// Fournir le paramètre d’entrée de la procédure stockée
SqlParameter param = new SqlParameter("@id", SqlDbType.Int, 8);
param.Value = 4;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);
// Adaptateur de données
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = sqlCom;
DataSet ds = new DataSet();
// Remplir le dataset ; deuxième paramètre = nom de la table interne
sqlDA.Fill(ds, "sdfdsf");
// Lier le contrôle grille WinForms
this.dataGridView1.DataSource = ds.Tables[0];
}Langage du code : C# (cs)
Exemple mieux structuré
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
string procName = "myProc";
using (SqlCommand sqlCom = new SqlCommand(procName, conn))
{
sqlCom.CommandType = CommandType.StoredProcedure;
// Syntaxe simplifiée pour les paramètres
sqlCom.Parameters.Add("@id", SqlDbType.Int).Value = 4;
SqlDataAdapter sqlDA = new SqlDataAdapter(sqlCom);
DataSet ds = new DataSet();
// Charger les résultats, alias de table ArticleResult
sqlDA.Fill(ds, "ArticleResult");
// Lier le contrôle
dataGridView1.DataSource = ds.Tables["ArticleResult"];
// Accès possible aussi par index : ds.Tables[0]
}
}Langage du code : JavaScript (javascript)
Analyse
Comportement de SqlDataAdapter.Fill()
- Gestion automatique de la connexion : si la connexion n’est pas Open() au moment d’appeler
Fill, l’adaptateur l’ouvre puis la referme à la fin ;
Le code exemple appelle explicitement
conn.Open(). Ça fonctionne, mais ce n’est pas obligatoire.
Fill(ds, "NomTable"): donne un nom au DataTable chargé en mémoire pour y accéder par nom. Sans précision, le nom par défaut estTable.- Quand une procédure stockée retourne plusieurs jeux de résultats,
Fillcrée plusieurs DataTable :ds.Tables[0], ds.Tables[1]...
Comparaison clé : DataSet vs SqlDataReader
| Objet | Mode | Occupation connexion | Cas d’usage |
|---|---|---|---|
| SqlDataReader | Lecture flux connecté | Garde la connexion base ouverte | Gros volumes, pas besoin de mise en cache complète, traitement ligne par ligne |
| DataSet(DataAdapter) | Cache mémoire déconnecté | Libère la connexion après Fill | Liaison contrôles UI, petits jeux de données, lectures répétées |
Paramètre obligatoire pour procédure stockée
sqlCom.CommandType = CommandType.StoredProcedure;
Sans cette ligne, ADO.NET interprète myProc comme du texte SQL classique et renvoie une erreur.
Liaison des contrôles
dataGridView1.DataSource = ds.Tables[0];
Le contrôle WinForms DataGridView accepte une liaison directe avec un DataTable et génère automatiquement les colonnes.
Si vous voulez enregistrer des modifications dans la base, utilisez SqlDataAdapter.Update() pour des mises à jour par lot.
Sans ouverture manuelle de connexion
using(SqlConnection conn=new SqlConnection(connectionString))
using(SqlCommand cmd=new SqlCommand("myProc",conn))
{
cmd.CommandType=CommandType.StoredProcedure;
cmd.Parameters.Add("@id",SqlDbType.Int).Value=4;
SqlDataAdapter da=new SqlDataAdapter(cmd);
DataSet ds=new DataSet();
da.Fill(ds,"Article"); // ouvre et ferme la connexion automatiquement
}Langage du code : JavaScript (javascript)
Cet exemple utilise des instructions using pour gérer la connexion
SqlDataAdapter