prova a inserire una riga nel database del server SQL usando c # ado, net

Nov 24 2020

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

3 MarcGravell Nov 24 2020 at 10:41

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.

jason.kaisersmith Nov 24 2020 at 09:49

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