Вопрос по vb.net, parameters, sql – Как использовать параметры «@» в команде SQL в VB

6

У меня есть этот код для обновления базы данных SQL из данных в текстовом поле в 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()

И это моя неудачная попытка установить параметр из того, что я видел в Интернете, что я не очень хорошо понимаю.

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

Как ты это делаешь? Причина, если есть & apos; Отметить в текстовом поле, когда я запускаю код, он вылетает.

Also see Matt R
возможный дубликатC# constructing parameter query SQL - LIKE % Ben

Ваш Ответ

2   ответа
9

Здесь есть ряд улучшений:

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
Что это за улучшения, о которых идет речь?
@PsychoData Правильно закрыть соединение в случае возникновения исключения, использовать параметры запроса, executetenonquery () вместо executereader, явный тип параметра вместо предполагаемого
21

Вы на правильном пути, чтобы избежатьБобби Столыно ваше понимание@ параметры неполные.

Именованные параметры ведут себя какvariables на языке программирования: сначала вы используете их в своей команде SQL, а затем указываете их значение в вашей программе на VB.NET или C #, например:

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

Обратите внимание, как текст вашей команды стал автономным: он больше не зависит от значения текста из текстового поля, поэтому пользователи не могут разбить ваш SQL, вставив свою собственную команду.@TicBoxText стал именем переменной, которая обозначает значение в тексте команды; призыв кAddWithValue поставляет значение. После этого вашExecuteReader готов к работе

+1 хорошее объяснение.
@JoelCoehoorn Я тоже, но это самый быстрый способ добиться успеха.
Не фанат метода AddWithValue (). Иногда он угадывает тип параметра неправильно (то есть: даты, varchar vs nvarchar), а иногда, когда это происходит, запрос больше не совпадает с индексом, который должен, что иногда приводит к серьезным проблемам с производительностью.
Спасибо, это имеет больше смысла для моих целей. TitanicSwimmer

Похожие вопросы