2012-06-21 9 views
6

Tengo este código para actualizar mi base de datos SQL a partir de datos en un cuadro de texto, en VB. Necesito utilizar parámetros en caso de que el texto contiene una marca de tic, ', o una cita ", etc. Aquí es lo que tengo:Cómo usar los parámetros "@" en un comando SQL en VB

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() 

y este es mi pobre intento de establecer un parámetro de lo que han visto en la web, lo que no entiendo del todo bien.

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() 

¿cómo se hace esto? Porque si hay una "marca en el cuadro de texto al ejecutar el código, que se estrelle.

+0

posible duplicado de [parámetro C# construyendo consulta SQL - COMO%] (http://stackoverflow.com/questions/664314/c-sharp-constructing -parameter-query-sql-like) – Ben

+0

[Ver también] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx#Y300) –

Respuesta

17

Estás en el camino correcto para evitar Bobby Tables, pero tu comprensión de @ paramet Ers está incompleto.

parámetros con nombre se comportan como variables de en un lenguaje de programación: en primer lugar, que los usa en su comando SQL, y luego se suministran su valor en su programa de VB.NET o C#, así:

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

Observe cómo el texto de su comando se volvió autocontenido: ya no depende del valor del texto del cuadro de texto, por lo que los usuarios no pueden romper su SQL al insertar su propio comando. @TicBoxText se convirtió en el nombre de la variable que representa el valor en el texto del comando; la llamada a AddWithValue proporciona el valor. Después de eso, su ExecuteReader está listo para funcionar.

+1

No me gusta el método AddWithValue(). A veces adivina el tipo de parámetro incorrecto (es decir, fechas, varchar vs nvarchar) y, a veces, cuando eso sucede, la consulta ya no se alinea con un índice que debería, lo que a veces da lugar a problemas de rendimiento drásticos. –

+0

@JoelCoehoorn Yo tampoco, pero esa es la manera más rápida de hacer que las cosas funcionen. – dasblinkenlight

+0

+1 buena explicación. – CaRDiaK

8

Hay una serie de mejoras aquí:

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 
+0

¿Cuáles son estas mejoras de las cuales hay un número? – PsychoData

+1

@PsychoData Cierre correctamente la conexión en caso de que se genere una excepción, use los parámetros de consulta, executenonquery() en lugar de executereader, tipo de parámetro explícito en lugar de inferir –

Cuestiones relacionadas