prova a inserire una riga nel database del server SQL usando c # ado, net
Sto cercando di inserire una riga in un database SQL Server utilizzando Ado.Net in un'applicazione console Sto leggendo l'input dalla tastiera ....
ecco il mio codice:
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());
}
}
il mio problema è che il compilatore legge la mia stringa interpolata come una stringa ma non riconosce le colonne come variabili ... legge l'intera riga come una singola stringa. qual è il problema?
Risposte
Questo è molto importante: non utilizzare stringhe interpolate con SQL; è male in ogni modo :
- sicurezza: iniezione SQL
- prestazioni: riutilizzo del piano di query
- affidabilità: fragilità con simboli riservati come
' - correttezza: problemi i18n / l10n (ovvero formattazione) - particolarmente rilevanti per il
DateTimevalore (data di nascita; "07/11/2020" è il 7 novembre? o l'11 luglio?) - ma anche l'importo delle tasse universitarie (in "123.456", la virgola è un separatore decimale (Francia et al)? O un separatore di gruppo?)
L'approccio corretto è parametri . Sempre.
Quindi, SQL come:
insert into product (ID,FirstName,LastName,DateOfBirth,TuitionFees)
values (@id, @firstName, @lastName, @dateOfBirth, @tuitionFees)
E per farlo, impara a conoscere i parametri di ADO.NET oppure usa uno strumento come Dapper che lo semplifica:
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 });
Inoltre, nota finale: non utilizzare doubleper la valuta; utilizzare decimal. doublenon è adatto per importi in valuta.
Hai posizionato il simbolo del dollaro all'interno della stringa, invece che davanti ad essa. Dovrebbe essere:
string sql = $"insert into product (ID,FirstName,LastName,DateOfBirth,TuitionFees) values {id}, {firstName}, {lastName}, {dateOfBirth}, {tuitionFees})";