ExecuteNonQuery

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

  1. INSERT : ajout réussi → retourne 1 ; échec : lève une exception ;
  2. UPDATE :
  • Enregistrements correspondants trouvés et modifiés → retour ≥1
  • Aucune ligne ne correspond à la clause WHERE → retour 0 (l’instruction s’exécute sans erreur, mais aucune donnée n’est mise à jour)
  1. 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=5 existe dans la table → res=1
  • Aucun enregistrement id=5res=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

  1. 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.
  2. Évitez d’exécuter des SELECT avec ExecuteNonQuery
    Pour les SELECT, cette méthode renvoie systématiquement -1 sans pouvoir récupérer les résultats. Utilisez ExecuteReader() / ExecuteScalar() pour lire des données.
  3. 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.
  4. Noms des paramètres strictement identiques
    Dans le SQL, @Title et @id doivent correspondre exactement aux noms des SqlParameter dans le code. La casse n’a pas d’importance, mais le nom ne doit pas différer.

Comparaison des trois méthodes SqlCommand

MéthodeUsageValeur de retour
ExecuteNonQueryAjout / Modification / Suppression (INSERT/UPDATE/DELETE)int Nombre de lignes affectées
ExecuteScalarRequête une ligne‑une colonne (COUNT, récupérer un identifiant auto‑incrémenté…)object Valeur de la première cellule
ExecuteReaderSELECT multi‑lignes multi‑colonnesSqlDataReader flux de données

ExecuteNonQuery

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *