Dans cet exemple, nous allons voir comment écrire des requêtes paramètrées. Déjà, pourquoi écrire des requêtes paramètrées ? Et bien d’une part pour ne pas se tromper dans l’écriture de la requête, qui n’a jamais oublié des ‘ dans ses applications ? Ensuite il se pose un problème de sécurité, en effet il peut se produire des failles de SQL Injection.
Prennons une table classique d’utilisateurs :

Une simple table avec trois colonnes : Un identifiant, un nom et un prénom.
1: // Variables quelconques
2: String lastname = "Lavocat";
3: String firstname = "Fabien";
4:
5: // Chaîne de connexion à la base de données
6: String cnxStr = System.Configuration.ConfigurationManager.ConnectionStrings[”cnx”].ConnectionString;
7: // Requête SQL
8: String sql = "INSERT INTO Users (user_lastname, user_firstname) VALUES ('" + lastname + "', '" + firstname + "')";
9:
10: using (System.Data.SqlClient.SqlConnection cnx = new System.Data.SqlClient.SqlConnection(cnxStr))
11: using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, cnx))
12: {
13: try
14: {
15: // Ouverture de la connexion
16: cnx.Open();
17:
18: // Exécution de la requête sur la base de données
19: cmd.ExecuteNonQuery();
20: }
21: catch (Exception e)
22: {
23: Console.WriteLine("Erreur : " + e.Message);
24: }
25: finally
26: {
27: // Fermeture de la connexion
28: if (cnx.State == System.Data.ConnectionState.Open)
29: cnx.Close();
30: }
31: }
Et maintenant en ajoutant des paramètres :
1: // Variables quelconques
2: String lastname = "Lavocat";
3: String firstname = "Fabien";
4:
5: // Chaîne de connexion à la base de données
6: String cnxStr = System.Configuration.ConfigurationManager.ConnectionStrings[”cnx”].ConnectionString;
7: // Requête SQL avec paramètres
8: String sql = "INSERT INTO Users (user_lastname, user_firstname) VALUES (@lastname, @firstname)";
9:
10: using (System.Data.SqlClient.SqlConnection cnx = new System.Data.SqlClient.SqlConnection(cnxStr))
11: using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(sql, cnx))
12: {
13: try
14: {
15: // Ajout des paramètres
16: cmd.Parameters.AddWithValue("lastname", lastname);
17: cmd.Parameters.AddWithValue("firstname", firstname); // Ouverture de la connexion
18: cnx.Open(); // Exécution de la requête sur la base de données
19: cmd.ExecuteNonQuery();
20: }
21: catch (Exception e)
22: {
23: Console.WriteLine("Erreur : " + e.Message);
24: }
25: finally
26: {
27: // Fermeture de la connexion
28: if (cnx.State == System.Data.ConnectionState.Open)
29: cnx.Close();
30: }
31: }
Vous remarquez la modification de la requête SQL. En effet j’ai rajouté deux paramètres qui sont des “variables” précédées d’un @.
1: cmd.Parameters.AddWithValue("lastname", lastname);
2: cmd.Parameters.AddWithValue("firstname", firstname);
Ces deux lignes permettent d’affecter à ces paramètres des valeurs.
Note : Le caractère "@" n’est pas obligatoire ici.
Mots clés Technorati :
Exemple de code,
C#,
SQL