Come utilizzare i parametri “@” in un comando SQL in VB

Ho questo codice per aggiornare il mio database SQL dai dati in una casella di testo, in VB. Ho bisogno di usare i parametri nel caso in cui il testo contenga un segno di spunta, ‘, o una citazione,’, ecc. Ecco cosa ho:

dbConn = New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP") dbConn.Open() MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = '" & TicBoxText.Text & _ "'WHERE Number = 1", dbConn) MyDataReader = MyCommand.ExecuteReader() MyDataReader.Close() dbConn.Close() 

E questo è il mio zoppo tentativo di impostare un parametro da quello che ho visto sul web, che non capisco molto bene.

 dbConn = New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP") dbConn.Open() MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = @'" & TicBoxText.Text & _ "'WHERE Number = 1", dbConn) MyDataReader = MyCommand.ExecuteReader() MyDataReader.Close() dbConn.Close() 

Come fai a fare questo? Causa se c’è un segno nella casella di testo quando eseguo il codice, si blocca.

Sei sulla strada giusta per evitare Bobby Tables , ma la tua comprensione dei parametri @ è incompleta.

I parametri con nome si comportano come variabili in un linguaggio di programmazione: prima li si utilizza nel comando SQL e quindi si fornisce il loro valore nel programma VB.NET o C #, in questo modo:

 MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = @TicBoxText WHERE Number = 1", dbConn) MyCommand.Parameters.AddWithValue("@TicBoxText", TicBoxText.Text) 

Nota come il testo del tuo comando è diventato autonomo: non dipende più dal valore del testo dalla casella di testo, quindi gli utenti non possono rompere il tuo SQL inserendo il proprio comando. @TicBoxText diventato un nome della variabile che rappresenta il valore nel testo del comando; la chiamata a AddWithValue fornisce il valore. Dopo ciò, il tuo ExecuteReader è pronto per andare.

Ci sono una serie di miglioramenti qui:

 Using dbConn As New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP"), _ MyCommand As SqlCommand("UPDATE SeansMessage SET Message = @Message WHERE Number = 1", dbConn) 'Make sure to use your exact DbType (ie: VarChar vs NVarChar) and size MyCommand.Parameters.Add("@Message", SqlDbType.VarChar).Value = TicBoxText.Text dbConn.Open() MyCommand.ExecuteNonQuery() ' don't open a data reader: just use ExecuteNonQuery End Using 'Using block will close the connection for you