1. Présentation de la méthode
SqlCommand.ExecuteNonQuery()
Cas d’utilisation : INSERT (ajout), UPDATE (modification), DELETE (suppression). Ne pas l’utiliser pour des requêtes SELECT
Valeur de retour : type int, correspondant au nombre de lignes modifiées par l’exécution SQL
Fonctionnement : après exécution d’une instruction DML, la base de données renvoie le nombre d’enregistrements modifiés. Le programme exploite cette valeur pour vérifier si l’opération a pris effet.
Logique métier basée sur la valeur de retour
- INSERT : ajout réussi → retourne
1; échec : lève une exception ; - UPDATE :
- Enregistrements correspondants trouvés et modifiés → retour ≥1
- Aucune ligne ne correspond à la clause
WHERE→ retour0(l’instruction s’exécute sans erreur, mais aucune donnée n’est mise à jour)
- DELETE :
- Suppression d’enregistrements correspondants → retour ≥1
- Aucun enregistrement correspondant → retour
0
Point important : retour 0 ≠ erreur du programme. La syntaxe SQL s’exécute normalement, simplement aucune ligne ne remplit les conditions pour être modifiée.
Exemple INSERT pour ajouter des enregistrements
private void button2_Click(object sender, EventArgs e)
{
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=True";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
// SQL paramétré pour prévenir l’injection SQL
sqlCom.CommandText = "INSERT INTO [dbo].[Article]([Title]) VALUES(@Title)";
sqlCom.CommandTimeout = 60;
SqlParameter param = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
param.Value = "Nouveau titre" + DateTime.Now;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);
int res = sqlCom.ExecuteNonQuery();
MessageBox.Show(res.ToString());
// res vaut 1 quand l’ajout réussit
}
}Langage du code : JavaScript (javascript)
Avantage : requêtes paramétrées, évite les failles d’injection SQL liées à la concaténation de chaînes.
Exemple UPDATE de mise à jour
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
sqlCom.CommandText = "UPDATE [dbo].[Article] SET [Title] = @Title WHERE id = @id";
sqlCom.CommandTimeout = 60;
SqlParameter param = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
param.Value = "Nouveau titre"+DateTime.Now;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);
// Deux manières équivalentes d’ajouter un paramètre
//Méthode 1 : créer l’objet puis l’ajouter
SqlParameter param2 = new SqlParameter("@id", SqlDbType.Int);
param2.Value = 5;
sqlCom.Parameters.Add(param2);
//Méthode 2 : initialisation fluide (commentée dans l’extrait)
//sqlCom.Parameters.Add(new SqlParameter("@id", SqlDbType.Int){Value=5});
int res = sqlCom.ExecuteNonQuery();
MessageBox.Show(res.ToString());Langage du code : JavaScript (javascript)
- L’enregistrement avec
id=5existe dans la table →res=1 - Aucun enregistrement
id=5→res=0
Exemple de contrôle métier :
if(res > 0)
{
MessageBox.Show("Mise à jour effectuée");
}
else
{
MessageBox.Show("Aucun enregistrement correspondant, rien n’a été modifié");
}Langage du code : JavaScript (javascript)
Remarques
- Ne pas se fier uniquement à l’absence d’exception pour valider le succès métier
L’absence d’erreur SQL ne garantit pas que les données ont été changées. Par exemple, si aucun enregistrement ne correspond aux filtres, la valeur retournée vaut 0. Vérifiez systématiquement le nombre de lignes affectées. - Évitez d’exécuter des SELECT avec
ExecuteNonQuery
Pour les SELECT, cette méthode renvoie systématiquement-1sans pouvoir récupérer les résultats. UtilisezExecuteReader()/ExecuteScalar()pour lire des données. - Intérêt de l’instruction using
using(SqlConnection conn)libère automatiquement la connexion base de données à la fin du bloc et prévient les fuites de connexion. - Noms des paramètres strictement identiques
Dans le SQL,@Titleet@iddoivent correspondre exactement aux noms desSqlParameterdans le code. La casse n’a pas d’importance, mais le nom ne doit pas différer.
Comparaison des trois méthodes SqlCommand
| Méthode | Usage | Valeur de retour |
|---|---|---|
| ExecuteNonQuery | Ajout / Modification / Suppression (INSERT/UPDATE/DELETE) | int Nombre de lignes affectées |
| ExecuteScalar | Requête une ligne‑une colonne (COUNT, récupérer un identifiant auto‑incrémenté…) | object Valeur de la première cellule |
| ExecuteReader | SELECT multi‑lignes multi‑colonnes | SqlDataReader flux de données |
ExecuteNonQuery