essayez d'insérer une ligne dans la base de données du serveur SQL en utilisant c # ado, net

Nov 24 2020

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

3 MarcGravell Nov 24 2020 at 10:41

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 DateTimevaleur (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 doublepour la monnaie; utiliser decimal. doublene convient pas aux montants en devises.

jason.kaisersmith Nov 24 2020 at 09:49

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})";