Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COMMENT FAIRE UNE REQUÊTE PARAMÉTRÉE DANS UNE BASE DE DONNÉE


Information sur le tutorial

Catégorie :Base de données Tutorial .NET ( DotNet ) Date de création : 04/07/2007 13:07:33 Vu : 8 691 fois

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

Description

Après avoir vu une quantité impressionnante de question sur ce forum comportant des requêtes SQL écrite sans paramètres, je me suis enfin décidé à écrire un petit tutorial à ce sujet.

Tutorial

Pourquoi utiliser des requêtes paramétrées ?


Eh oui, certains me diront, "mais j'ai jamais fait comme ça, et ça fonctionne très bien".

Alors qu'ils font des requêtes du style :


String sql = "INSERT INTO TableTest(Id, Text, DateAndTime, FloatNumber) VALUES(" + id.ToString() + ",'" + text + "'," + DateTime.Now.ToString() + "," + floatNum.ToString() + ")";


Mais il faut connaître les risque de telles requêtes, je vais essayer d'en résumé quelques-uns ci-dessous :

Problèmes de régionalisation :

Les dates, comme les nombre à virgule, peuvent avoir des formats différents suivant les régions, une requête peut très bien fonctionner sur un environnement de développement, et plus chez un client.

DateTime.Now.Tostring() ne donneras pas forcément un format de date valide pour la base de donnée, ou peux inverser les jours et les mois. Bonjour la maintenance pour démêler tout ça !


Problèmes de texte

Un texte mis dans une requête SQL doit être entouré du caractère '. Si le texte à insérer en contient aussi, il ne faut pas oublier de remplacer tout ' par des doubles '', pour que le SQL fonctionne.

Dans l'exemple ci-dessus, si la variable text contient des ', la requête va échouer.

Ca peut paraître insignifiant, mais ça peut aussi être la source de trous de sécurité. (cf Injection SQL)


Comment faire juste ?


Le code ci-dessous donne un petit exemple de requête paramétrée. Il s'appuie sur une table de 4 colonnes (Id int, text varchar(50), DateAndTime DateTime, FloatNumber float), et y insère une ligne.


using (SqlConnection conn = new SqlConnection(connectionString))

{

//Préparation des paramètres

SqlParameter paramID = new SqlParameter("@id", SqlDbType.Int);

paramID.Value = 10;

SqlParameter paramText = new SqlParameter("@text", SqlDbType.VarChar,50);

paramText.Value = "Ceci est un test";

SqlParameter paramDate = new SqlParameter("@date", SqlDbType.DateTime);

paramDate.Value = DateTime.Now;

SqlParameter paramFloat = new SqlParameter("@float", SqlDbType.Float);

paramFloat.Value = 12.2;


//Préparation de la commande

String sql = string.Format("INSERT INTO TableTest(Id, Text, DateAndTime, FloatNumber) VALUES({0},{1},{2},{3})",

paramID.ParameterName, paramText.ParameterName,

paramDate.ParameterName, paramFloat.ParameterName);

SqlCommand cmd = new SqlCommand(sql.ToString(), conn);


//Ajout des paramètre à la commande

cmd.Parameters.Add(paramID);

cmd.Parameters.Add(paramText);

cmd.Parameters.Add(paramDate);

cmd.Parameters.Add(paramFloat);

//Ouverture de la connection et exécution de la commande

conn.Open();

cmd.ExecuteNonQuery();

}


Bien sur, ces paramètres peuvent aussi être utilisés pour des UPDATE, SELECT ou DELETE, dans la clause WHERE ou ailleurs dans la requête.


J'espère que ce mini tutorial vous aidera, et n'hésitez pas à me faire vos commentaires.


Amicalement,


Sharpmao

signaler à un administrateur
Commentaire de romagny13 le 10/07/2007 13:03:26

moi j'ai mis 9/10 je le trouve bien sympathique ce petit tuto , bon c'est vrai que au niveau du code il aurait peut etre fallu faire encore plus accessible, puis decrire bien chaque propièté utilisable des paramètres (parametername,dbtype,direction,value,...)(demarche progressive) car je crois que ce qui freine le plus les debutants justement c'est qu'ils ont l'impression que c'est assez compliqué d'utiliser des paramètres, embettant, du coup ils preferent utiliser la mauvaise methode lol
ce qui n'est pas le cas
+

signaler à un administrateur
Commentaire de sebmafate le 23/07/2007 13:39:57 administrateur CS

j'suis vert... j'ai posté mon tuto 2 jours avant toi !

signaler à un administrateur
Commentaire de computer59 le 29/10/2007 09:39:41

Un grand merci d'un débutant en C#,j'vais testé ça tout de suite !!

signaler à un administrateur
Commentaire de michel771 le 31/10/2007 19:04:13

merci pour ce tuto, il m' a ete d une grande utilité.

de la part d un debutant.

signaler à un administrateur
Commentaire de olibara le 19/04/2008 21:35:10

Pour sebmafate

Salut seb

Je venais de lire ton tuto mais il faut reconnaitre que sharpmao a fait un petit effort suplémentaire pou etre plus complet

Il y a cependant encore a mon avis beaucoup de choses a dire car comme le dis tres bien sharpmao j'hesite moi aussi a utiliser ce truc qui n'est pas tres limpide avec des notions telles que
SourceVersion = DataRowVersion.Original;

bref comme beaucoup d'autre je prefere encore ecrire en dur car je n'ai pas encore vraiment trouvé de doc bien faite sur le sujet

signaler à un administrateur
Commentaire de ggomezpe le 21/07/2008 16:54:14

Simple, clair, excellent. Que dire de plus. Il manque une ou deux lignes de commentaires sur certaines commandes à l'intention les plus néophytes pour qualifier ce mini-tutorial de parfait.

signaler à un administrateur
Commentaire de sh4gm4 le 16/09/2008 09:46:08

Salut,
Comment ca se passe pour une enorme requette a laquelle je ne rajoute pas de param.
La question est peut etre stupide, mais je peux faire (?) :
"SELECT * "+
"FROM maTable "+
"WHERE truc = 0 AND bidule = 'zog' "+
"ORDER BY truc DESC"
ou la concatenation est la aussi non-recommandée dans ce cas?
Merci :)

signaler à un administrateur
Commentaire de sebmafate le 16/09/2008 10:31:29 administrateur CS

dans ce cas, il existe 2 solutions :
string.Concat("SELECT * ",
"FROM maTable ",
"WHERE truc = 0 AND bidule = 'zog' ",
"ORDER BY truc DESC");

ou bien :
@"SELECT *
FROM maTable
WHERE truc = 0 AND bidule = 'zog'
ORDER BY truc DESC"

signaler à un administrateur
Commentaire de noches le 13/10/2008 15:32:44

Mon sauveur... c'est merveilleux...ça marche tout simplement... Que de galère à utiliser tout cela quand PERSONNE n'est capable de faire des tutos simples, clairs, concis, et fonctionnels! Merci beaucoup!

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Novembre 2008
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,016 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.