Versuchen Sie, mit c # ado, net eine Zeile in die SQL Server-Datenbank einzufügen

Nov 24 2020

Ich versuche, mit Ado.Net in einer Konsolenanwendung eine Zeile in eine SQL Server-Datenbank einzufügen. Ich lese Eingaben von der Tastatur.

Hier ist mein 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());
   }
}

Mein Problem ist, dass der Compiler meine interpolierte Zeichenfolge als Zeichenfolge liest, die Spalten jedoch nicht als Variablen erkennt. Er liest die gesamte Zeile als einzelne Zeichenfolge. worin besteht das Problem?

Antworten

3 MarcGravell Nov 24 2020 at 10:41

Dies ist sehr wichtig: Verwenden Sie keine interpolierten Zeichenfolgen mit SQL. es ist in jeder Hinsicht schlecht :

  • Sicherheit: SQL-Injection
  • Leistung: Wiederverwendung des Abfrageplans
  • Zuverlässigkeit: Sprödigkeit mit reservierten Symbolen wie '
  • Richtigkeit: i18n / l10n (dh Formatierungsprobleme) - besonders relevant für den DateTimeWert (Geburtsdatum; ist "07/11/2020" der 7. November? oder der 11. Juli?) - aber auch die Höhe der Studiengebühren (in "123,456", ist das Komma ein Dezimaltrennzeichen (France et al.) Oder ein Gruppentrennzeichen?)

Der richtige Ansatz sind Parameter . Immer.

Also, SQL wie:

insert into product (ID,FirstName,LastName,DateOfBirth,TuitionFees)
values (@id, @firstName, @lastName, @dateOfBirth, @tuitionFees)

Um dies zu tun, lernen Sie entweder die ADO.NET-Parameter kennen oder verwenden Sie ein Tool wie Dapper , das dies vereinfacht:

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

Auch letzte Anmerkung: Nicht doublefür Währung verwenden; verwenden decimal. doubleist nicht für Währungsbeträge geeignet.

jason.kaisersmith Nov 24 2020 at 09:49

Sie haben das Dollarzeichen in die Zeichenfolge anstatt davor eingefügt. Es sollte sein:

string sql = $"insert into product (ID,FirstName,LastName,DateOfBirth,TuitionFees) values {id}, {firstName}, {lastName}, {dateOfBirth}, {tuitionFees})";