#sql-server #vb.net
#sql-сервер #vb.net
Вопрос:
Я хочу обновить столбец таблицы, где имя столбца будет вводиться в текстовое поле во время выполнения. Следующий код не выполняет никаких действий. TextBox14 содержит имя столбца, а TextBox12 содержит значение, подлежащее обновлению.
Dim squery As String = "SELECT name,days from definedLeave"
Dim cmd6 As SqlCommand = New SqlCommand(squery, con)
Dim dr6 As SqlDataReader = cmd6.ExecuteReader()
Dim i As Integer = 0
While dr6.Read()
Try
s = dr6(i).ToString
TextBox14.Text = s
a = dr6(i 1).ToString
TextBox12.Text = a
Dim sql = "update empLeave set " amp; TextBox14.Text.Trim amp; "=@na where epid='" txtCode.Text "'"
Using com7 = New SqlCommand(sql, con)
com7.Parameters.AddWithValue("@na", TextBox12.Text)
com7.ExecuteNonQuery()
End Using
Catch ex As Exception
MsgBox("HELLO")
End Try
End While
com7.Dispose()
dr6.Close()
Ответ №1:
К сожалению, параметры могут использоваться только для значений, а не для идентификаторов. Они похожи на переменные в VB — вы также не можете использовать содержимое одной переменной для обозначения другой переменной в VB.
Глупо то, что вы пытаетесь использовать параметр там, где вы не можете, а затем там, где вы можете, для epid
значения вы используете конкатенацию строк. Ваш код должен выглядеть примерно так:
Dim sql = "UPDATE empleave SET [" amp; TextBox14.Text amp; "] = @na WHERE epid = @epid"
Using com7 = New SqlCommand(sql, con)
com7.Parameters.AddWithValue("@na", TextBox12.Text)
com7.Parameters.AddWithValue("@epid", txtCode.Text)
com7.ExecuteNonQuery()
End Using
Однако это все равно оставляет вас открытым для внедрения SQL, поэтому вы должны быть абсолютно уверены, что сначала вы проверяете имя столбца. На самом деле, что вам нужно сделать, это запросить базу данных, чтобы сначала получить имена столбцов, а затем поместить их в ComboBox
. Таким образом, вы гарантируете, что пользователь выберет допустимое значение.
Комментарии:
1. @jimcilhinney оба формата не работают. На самом деле я взял содержимое из другой таблицы в качестве имен столбцов для этой таблицы. Я отредактировал часть кода с полным кодом. пожалуйста, проверьте
2. Возможно, вы могли бы быть немного более конкретными, чем «не работает». Нам неинтересно угадывать, что на самом деле происходит, когда вы уже знаете. Сообщения об ошибках предоставляются не для развлечения, а для информации.
3. Если исключение не выдается, то вызов выполняется успешно, поэтому либо нет подходящих строк для обновления, либо соответствующие строки обновляются. Другого возможного результата нет. Какое значение
ExecuteNonQuery
возвращается? Если он равен нулю, то совпадающих записей нет, а если он не равен нулю, то столько записей совпало и было обновлено.4. ExcecuteNonQuery выполняется не только. Как только он достигает инструкции update, выполняется оператор catch.
5. Боже мой! Ранее вы сказали, что ошибки не было, а теперь говорите, что выполняется оператор catch. Операторы Catcxh выполняются при возникновении ошибки, то есть они перехватывают исключение, которое было выдано. Это исключение имеет
Message
свойство, которое сообщает вам, что пошло не так. Если вы хотите, чтобы мы помогли вам исправить то, что пошло не так, то предоставление этой информации было бы хорошей идеей, особенно когда мы просим об этом конкретно.
Ответ №2:
Попробуйте так
Dim sql as string= "update empLeave set " amp; TextBox14.Text.Trim amp; "=@na where
epid='" txtCode.Text "'"
Using com7 = New SqlCommand(sql, con)
com7.Parameters.AddWithValue("@na", TextBox12.Text)
com7.ExecuteNonQuery()
End Using
Комментарии:
1. Я попробовал приведенный выше код, но он не сработал. Таблица не обновляется, и вы не получаете никакого сообщения об ошибке.
2. вы проверили свой запрос. Отправьте свой запрос
3. Dim sql = «обновить empLeave set » amp; TextBox14.Text. Обрезать amp; «=@na, где epid='» txtCode. Текст «‘» С использованием com7 = Новая команда SqlCommand(sql, con) com7. Параметры. AddWithValue(«@na», TextBox12.Text) com7. ExecuteNonQuery() Завершает использование
4. поставьте точку останова в dim sql, чтобы проверить, какую строку return присваивать в sql
5. «НИЧЕГО» не назначено