essayez d'insérer une ligne dans la base de données du serveur SQL en utilisant c # ado, net
J'essaie d'insérer une ligne dans une base de données SQL Server en utilisant Ado.Net dans une application console Je lis l'entrée du clavier ...
voici mon code:
private void InsertStudents(string con)
{
SqlConnection Connection = new SqlConnection(con);
SqlDataAdapter adapter = new SqlDataAdapter();
int id = Convert.ToInt32(Console.ReadLine());
string firstName = Console.ReadLine();
string lastName = Console.ReadLine();
DateTime dateOfBirth = Convert.ToDateTime(Console.ReadLine());
double tuitionFees = Convert.ToDouble(Console.ReadLine());
string sql = "$insert into product (ID,FirstName,LastName,DateOfBirth,TuitionFees) values {id}, {firstName}, {lastName}, {dateOfBirth}, {tuitionFees})";
try
{
Connection.Open();
adapter.InsertCommand = new SqlCommand(sql, Connection);
adapter.InsertCommand.ExecuteNonQuery();
Console.WriteLine(" 1 Row inserted!");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
mon problème est que le compilateur lit ma chaîne interpolée comme une chaîne mais ne reconnaît pas les colonnes comme des variables ... il lit la ligne entière comme une chaîne unique. quel est le problème?
Réponses
Ceci est très important: n'utilisez pas de chaînes interpolées avec SQL; c'est mauvais à tous points de vue :
- sécurité: injection SQL
- performances: réutilisation du plan de requête
- fiabilité: fragilité avec des symboles réservés comme
'
- exactitude: problèmes i18n / l10n (c'est-à-dire formatage) - particulièrement pertinents pour la
DateTime
valeur (date de naissance; est-ce que "07/11/2020" est le 7 novembre? ou le 11 juillet?) - mais aussi le montant des frais de scolarité (en "123 456", la virgule est-elle un séparateur décimal (France et al)? Ou un séparateur de groupe?)
La bonne approche est celle des paramètres . Toujours.
Donc, SQL comme:
insert into product (ID,FirstName,LastName,DateOfBirth,TuitionFees)
values (@id, @firstName, @lastName, @dateOfBirth, @tuitionFees)
Et pour le faire, soit en apprendre davantage sur les paramètres de ADO.NET, ou: utiliser un outil comme Dapper qui permet de simplifier le:
int id = ...
string firstName = ...
string lastName = ...
DateTime dateOfBirth = ...
double tuitionFees = ...
using var conn = new SqlConnection(con); // Dapper will deal with the open/close
conn.Execute(@"
insert into product (ID,FirstName,LastName,DateOfBirth,TuitionFees)
values (@id, @firstName, @lastName, @dateOfBirth, @tuitionFees)",
new { id, firstName, lastName, dateOfBirth, tuitionFees });
Aussi, note finale: ne pas utiliser double
pour la monnaie; utiliser decimal
. double
ne convient pas aux montants en devises.
Vous avez placé le signe dollar à l'intérieur de la chaîne, au lieu de devant. Ça devrait être:
string sql = $"insert into product (ID,FirstName,LastName,DateOfBirth,TuitionFees) values {id}, {firstName}, {lastName}, {dateOfBirth}, {tuitionFees})";