Optimisation d’exécution et passage des paramètres

1. Vérifier l’état de connexion de SqlConnection

Propriété : conn.State

Type énuméré ConnectionState

// Ouvre la connexion si elle n’est pas déjà ouverte
if (conn.State != ConnectionState.Open)
{
    conn.Open();
}Langage du code : JavaScript (javascript)

Remarque : utilisé avec using, l’état passe automatiquement à Closed après libération de la connexion.
États courants : Open / Closed / Connecting, etc.

2. Point clé : vérification des valeurs null avec ExecuteScalar

Vérifiez la valeur renvoyée par ExecuteScalar pour éviter les erreurs liées aux valeurs null

object obj = sqlCom.ExecuteScalar();

// Il faut tester à la fois null et DBNull.Value
if (obj == null || obj == System.DBNull.Value)
{
    MessageBox.Show("Le résultat est null");
}
else
{
    MessageBox.Show(obj.ToString());
}Langage du code : JavaScript (javascript)

Distinction :

  • null : aucune ligne de données n’est retournée
  • DBNull.Value : une ligne est trouvée mais le champ vaut NULL dans la base de données

3. Système de paramètres SqlCommand (protection contre l’injection SQL)

1. Objet principal

La collection SqlCommand.Parameters contient plusieurs objets SqlParameter. Les requêtes paramétrées éliminent totalement les failles d’injection SQL.

2. Exemple de création de paramètre
// Nom du paramètre, type de données, taille
SqlParameter paramSql = new SqlParameter("@Title", SqlDbType.NVarChar, 250);

// Affectation de la valeur
paramSql.Value = model.Title;

// Ajout à l’objet commande
sqlCom.Parameters.Add(paramSql);Langage du code : JavaScript (javascript)
3. Direction du paramètre ParameterDirection (énumération)
paramSql.Direction = ParameterDirection.Output;
Membre énuméréValeurDescription
Input1Valeur par défaut : paramètre d’entrée (transmet des valeurs au SQL)
Output2paramètre de sortie, récupère le résultat après exécution de procédure stockée
InputOutput3accepte une entrée et renvoie une sortie après exécution

Exemple complet

private void button1_Click(object sender, EventArgs e)
{
    string connectionString = "Data Source=.;Initial Catalog=db;User ID=sa;Password=xxx";
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        // Ouverture sécurisée de la connexion
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }

        SqlCommand sqlCom = new SqlCommand();
        sqlCom.Connection = conn;
        sqlCom.CommandTimeout = 60;
        // Utilisez systématiquement des requêtes paramétrées : jamais de concaténation de chaînes !
        sqlCom.CommandText = "SELECT [Title] FROM [dbo].[Article] WHERE Title = @Title";

        // Construction du paramètre
        SqlParameter paramTitle = new SqlParameter("@Title", SqlDbType.NChar, 10);
        paramTitle.Value = "Titre de test";
        sqlCom.Parameters.Add(paramTitle);

        object obj = sqlCom.ExecuteScalar();
        if (obj == null || obj == DBNull.Value)
        {
            MessageBox.Show("Le résultat est null");
        }
        else
        {
            MessageBox.Show(obj.ToString());
        }
    }
}Langage du code : JavaScript (javascript)

Règles de développement importantes

  1. Interdiction de concaténer des chaînes SQL : utilisez systématiquement SqlParameter pour le paramétrage ;
  2. Préférez le bloc using pour libérer automatiquement les ressources de tous les SqlConnection et SqlCommand ;
  3. Avec ExecuteScalar, vérifiez systématiquement à la fois null + DBNull.Value ;
  4. Faites la différence entre CommandTimeout (délai d’exécution SQL) et Connect Timeout dans la chaîne de connexion (délai d’établissement de la connexion).

Optimisation d’exécution et passage des paramètres

Laisser un commentaire

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