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(); }
3 Réponses :
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.
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();
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
Ce que vous devriez vraiment faire, c'est utiliser une requête paramétrée pour que votre requête ressemble à ceci:
insert into Customer_info(Customer_Name,Customer_Phone) values (''; DROP TABLE [Customer_Info]; -- ','');
Vous utiliseriez alors une SQLCommand
pour passer les paramètres à la requête:
using (var command = new SqlCommand(query, connection)) { command.Parameters.AddWithValue("@name", name); command.Parameters.AddWithValue("@phone", phone); command.ExecuteNonQuery(); }
La raison en est qu'il évite le risque d ' injection SQL (qui fait partie du OWASP Top 10 a >). Considérez un instant votre requête actuelle si le nom
transmis contenait du SQL, par exemple s'il contenait:
'; DROP TABLE [Info_Client]; -
Cela voudrait dire que votre SQL construit (si phone
était vide) ressemblerait à ceci:
var query = "insert into Customer_info(Customer_Name,Customer_Phone)" + "values(@name, @phone);";
Cela pourrait bien entraîner la suppression de votre table Customer_Info
si l'utilisateur auquel le code se connecte à SQL dispose des droits suffisants pour le faire.
@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.
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 a >.