126 votes

Pourquoi préférons-nous toujours utiliser des paramètres dans les instructions SQL?

Je suis très novice en matière de travail avec les bases de données. Maintenant, je sais écrire les commandes SELECT, UPDATE, DELETE et INSERT. Mais j'ai vu de nombreux forums où nous préférons écrire:

SELECT empSalary from employee where salary = @salary

...au lieu de :

SELECT empSalary from employee where salary = txtSalary.Text

Pourquoi préférons-nous toujours utiliser des paramètres et comment les utiliser ?

Je voulais connaître l'utilisation et les avantages de la première méthode. J'ai même entendu parler d'injection SQL mais je ne le comprends pas pleinement. Je ne sais même pas si l'injection SQL est liée à ma question.

3voto

user1585345 Points 33

Les autres réponses couvrent l'importance des paramètres, mais il y a un inconvénient! En .net, il existe plusieurs méthodes pour créer des paramètres (Add, AddWithValue), mais elles nécessitent toutes que vous vous souciiez inutilement du nom du paramètre, et elles réduisent toutes la lisibilité du SQL dans le code. Juste au moment où vous essayez de méditer sur le SQL, vous devez chercher autour, au-dessus ou en dessous pour voir quelle valeur a été utilisée dans le paramètre.

Je revendique humblement que ma petite classe SqlBuilder est la manière la plus élégante d'écrire des requêtes avec des paramètres. Votre code ressemblera à ceci...

C#

var bldr = new SqlBuilder( myCommand );
bldr.Append("SELECT * FROM CUSTOMERS WHERE ID = ").Value(myId);
//ou
bldr.Append("SELECT * FROM CUSTOMERS WHERE NAME LIKE ").FuzzyValue(myName);
myCommand.CommandText = bldr.ToString();

Votre code sera plus court et beaucoup plus lisible. Vous n'avez même pas besoin de lignes supplémentaires, et, lorsque vous faites des lectures, vous n'avez pas besoin de chercher la valeur des paramètres. La classe dont vous avez besoin se trouve ici...

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

public class SqlBuilder
{
private StringBuilder _rq;
private SqlCommand _cmd;
private int _seq;
public SqlBuilder(SqlCommand cmd)
{
    _rq = new StringBuilder();
    _cmd = cmd;
    _seq = 0;
}
public SqlBuilder Append(String str)
{
    _rq.Append(str);
    return this;
}
public SqlBuilder Value(Object value)
{
    string paramName = "@SqlBuilderParam" + _seq++;
    _rq.Append(paramName);
    _cmd.Parameters.AddWithValue(paramName, value);
    return this;
}
public SqlBuilder FuzzyValue(Object value)
{
    string paramName = "@SqlBuilderParam" + _seq++;
    _rq.Append("'%' + " + paramName + " + '%'");
    _cmd.Parameters.AddWithValue(paramName, value);
    return this;
}
public override string ToString()
{
    return _rq.ToString();
}
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X