2
votes

Interpolation de chaîne dans une commande SQL

Existe-t-il un moyen plus simple d'utiliser les variables name et phone dans la commande SQL d'insertion ci-dessous?

L'interpolation de chaîne est un moyen mais je ne sais pas comment l'implémenter. p >

String name = textBox1.Text;
String phone = textBox2.Text;  
     
var query = "insert into Customer_info(Customer_Name,Customer_Phone) " +
            "values('" + name + "','" + phone + "');";
SqlCommand com = new SqlCommand(query,con);

try {
    con.Open();
    com.ExecuteNonQuery();
    con.Close();
}

catch (Exception Ex) {
    con.Close();
}


1 commentaires

Au lieu d'utiliser une chaîne concaténée ou une interpolation de chaîne pour créer une chaîne de requête à partir de l'entrée utilisateur, utilisez des paramètres à la place - voir Little Bobby Tables .


3 Réponses :


2
votes

Pour utiliser l'interpolation de chaîne, vous devez écrire:

var query = $"insert into Customer_info(Customer_Name,Customer_Phone) values('{name}','{phone}');";

Mais, bien sûr, vous êtes enclin à l'injection SQL, ce que vous devez éviter!

Utilisez SqlCommand.Parameters pour ajouter un paramètre et être à l'abri de ce thread.


0 commentaires

3
votes

Ne le fais pas! Sérieusement, ne le faites pas. L'interpolation de chaîne n'est pas adaptée à la création de SQL. Utilisez simplement les paramètres:

conn.Execute(query, new { name, phone });

Ou utilisez une bibliothèque comme dapper (qui supprime tout le code ADO.NET en désordre pour vous, comme les commandes, les paramètres et les lecteurs):

var query = @"
insert into Customer_info(Customer_Name,Customer_Phone)
values(@name,@phone);";
//...
cmd.Parameters.AddWithValue("name", name);
cmd.Parameters.AddWithValue("phone", phone);
cmd.ExecuteNonQuery();


5 commentaires

où sont les méthodes try catch?


@GragasIncoming qu'est-ce que j'attrape et pourquoi? franchement, utiliser est loin plus utile que essayez / catch - la réponse de Rob montre le placement de cela.


Alors, comment sortiriez-vous une erreur? Par exemple. à l'intérieur de la fonction catch ex.Message;


@GragasIncoming si vous voulez dire à propos de l ' essayez / catch dans la question: ils n'étaient pas dans la question quand j'ai répondu; aussi: votre catch avale l'exception; aussi, il est assez rare que vous ayez besoin de Fermer () une connexion - il est beaucoup plus souvent d'utiliser using pour la vie ici. Notez que dans la version dapper: dapper gérera correctement la durée de vie de la connexion de toute façon - si la connexion n'est pas ouverte lorsque vous appelez Execute , il l'ouvrira, l'exécutera, et fermez-le, etc. (il ne le ferme pas s'il était ouvert initialement, évidemment)


@GragasIncoming re "Alors, comment feriez-vous pour générer une erreur?" - J'attraperais probablement cela beaucoup plus près du code qui va afficher l'erreur; si votre code d'accès aux données et votre code d'interface utilisateur sont mélangés, ce n'est pas une grande séparation des préoccupations



4
votes

2 commentaires

@GragasIncoming, non, ce n'est vraiment pas comme ça que vous faites ... vous concaténez les valeurs dans query , je les passe en paramètres . Ce sont des manières fondamentalement différentes de construire la requête qui est transmise à SQL Server. S'il vous plaît dans l'intérêt de quiconque est un client de la société pour laquelle ce code est écrit, prenez une demi-heure pour comprendre pourquoi la concaténation est mauvaise. Voici une page de OWASP qui contient quelques exemples supplémentaires qui peuvent aider: owasp.org/index.php / SQL_Injection


Je pense que cela nécessite connection.Open (); parce qu'il donne une erreur.