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éeDBNull.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é | Valeur | Description |
|---|---|---|
| Input | 1 | Valeur par défaut : paramètre d’entrée (transmet des valeurs au SQL) |
| Output | 2 | paramètre de sortie, récupère le résultat après exécution de procédure stockée |
| InputOutput | 3 | accepte 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
- Interdiction de concaténer des chaînes SQL : utilisez systématiquement
SqlParameterpour le paramétrage ; - Préférez le bloc
usingpour libérer automatiquement les ressources de tous lesSqlConnectionetSqlCommand; - Avec ExecuteScalar, vérifiez systématiquement à la fois
null + DBNull.Value; - Faites la différence entre
CommandTimeout(délai d’exécution SQL) etConnect Timeoutdans la chaîne de connexion (délai d’établissement de la connexion).
Optimisation d’exécution et passage des paramètres
Previous: CommandTimeout
Next: ExecuteNonQuery