Versuchen Sie, mit c # ado, net eine Zeile in die SQL Server-Datenbank einzufügen
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
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
DateTime
Wert (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 double
für Währung verwenden; verwenden decimal
. double
ist nicht für Währungsbeträge geeignet.
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})";