3 votes

Un moyen facile d'échapper aux chaînes de caractères sql ?

Dans mon code, j'ai ceci partout

command.Parameters.Add("@name", DbType.String).Value = name;

Y a-t-il un moyen plus facile ? J'aimerais faire quelque chose comme

command.command.CommandTextFn("insert into tbl(key,val) values(?, ?);", key, value);

et lui faire déterminer si la clé/valeur est une chaîne ou un nombre entier. Ça ne me dérangerait pas de devoir utiliser {0} au lieu de ?

13voto

tvanfosson Points 268301

Utilisez le AddWithValue méthode :

command.Parameters.AddWithValue( "@name", name );

Vous pourriez l'utiliser en conjonction avec une méthode d'extension :

public static SqlCommand CreateCommand(this SqlConnection connection, string command, string[] names, object[] values )
{
     if (names.Length != values.Length)
     {
          throw new ArgumentException("name/value mismatch");
     }

     var cmd = connection.CreateCommand();
     cmd.CommandText = command;
     for (int i = 0; i < names.Length; ++i )
     {
         cmd.Parameters.AddWithValue(names[i], values[i]);
     }

     return cmd;
}

utilisé comme

var command = connection.CreateCommand( "insert into tbl (key,val) values(@key,@val)",
                                        new string[] { "@key", "@val" },
                                        new object[] { key, val } );

4voto

Rubens Farias Points 33357

L'utilisation de requêtes paramétrées protège votre système contre les attaques par injection SQL.

Bien sûr, vous pouvez vous occuper de l'échappement SQL, mais à quoi bon ? Vous pouvez faire une erreur et vous en rendre compte trop tard.

Veuillez lire cet article car il explique les avantages et les inconvénients de l'utilisation de requêtes paramétrées.

Investissez votre temps à améliorer d'autres morceaux de code.

4voto

Murph Points 7600

Tu fais la bonne chose - en utilisant des paramètres est la meilleure solution à la fois pour la réutilisation du code et pour vous protéger des attaques par injection SQL . Ce n'est pas cassé, alors ne le réparez pas !

Si elle vraiment Si cela vous dérange (et cela ne devrait pas être le cas), vous pouvez probablement faire preuve de créativité avec une méthode d'extension pour vous permettre d'envelopper ce bout de code dans quelque chose d'un peu plus petit, mais en vérité, il y a de meilleures choses dont il faut se préoccuper.

2voto

DanDan Points 5523

Créez un ensemble de fonctions génériques qui prennent le nom du paramètre et la valeur. Enveloppez et cachez tout votre code passe-partout.

1voto

erikkallen Points 16601

Vous pourriez écrire votre propre méthode d'extension (non testée, pouvant nécessiter des modifications mineures) :

private static DbType MapToDbType(Type t) {
    return something;
}

public static void CommandTextFn(this IDbCommand cmd, string stmt, params object[] parameters) {
    try {
        for (int i = 0; i < params.Length; i++) {
            IDbParameter p = cmd.Parameters.Add(string.Format(NumberFormatInfo.InvariantInfo, "@{0}", i), object.ReferenceEquals(parameters[i], null) ? DbType.String : MapToDbType(parameters[i].GetType());
            p.Value = parameters[i];
        }
        int currentIndex;
        cmd.CommandText = new Regex("\\?").Replace(stmt, m => cmd.Parameters.Add(string.Format(NumberFormatInfo.InvariantInfo, "@{0}", currentIndex++);
        cmd.ExecuteNonQuery();
    }
    finally {
        cmd.Parameters.Clear();
    }
}

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