Babai JermenKeller Sasmal Ответов: 2

Как обновить табличные значения базы данных SQL.


Ну, я пытаюсь обновить свои значения базы данных SQL и выдает некоторую ошибку. У меня есть form1, в котором есть ComboBox1.Text, который помогает автоматически заполнять мои поля form2. Но когда я пытаюсь сохранить что-нибудь оттуда с помощью MODIFY_BUtton, он говорит:

Неправильный синтаксис около ключевого слова 'не'.

Пожалуйста, поправь меня, пока я не сошел с ума.

Что я уже пробовал:

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        connection = New SqlConnection("SERVER=\MySQLserver;USER ID=MyID;PASSWORD=MyPASS;DATABASE=MyDATABASE")
        Dim reader As SqlDataReader
        Try
            connection.Open()
            Dim nDate As Date = Date.Now.ToString(" yyyy-MM-dd")
            Dim query As String = "UPDATE faculty SET id='" & TextBox1.Text & "',dept='" & ComboBox1.Text & "',sub='" & ComboBox2.Text & "',pre='" & ComboBox3.Text & "',name='" & TextBox2.Text & "',dob='" & DateTimePicker1.Value & "',sex='" & ComboBox4.Text & "',addr='" & TextBox3.Text & "',city='" & TextBox4.Text & "',state='" & TextBox5.Text & "',pin='" & TextBox6.Text & "',country='" & TextBox7.Text & "',nat='" & TextBox8.Text & "',mob='" & TextBox9.Text & "',email='" & TextBox10.Text & "',uname='" & TextBox11.Text & "',pword='" & TextBox12.Text & "',sec='" & ComboBox5.Text & "',ans='" & TextBox14.Text & "',mod='" & nDate & "' where id='" & TextBox1.Text & "'"
            command = New SqlCommand(query, connection)
            reader = command.ExecuteReader
            MsgBox("Record Updated")
            Me.Close()
            connection.Close()
            load_dgv()
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            connection.Dispose()
        End Try
    End Sub

Bryian Tan

Откуда взялось это "откуда"? Я не вижу этого в опубликованном коде.

Babai JermenKeller Sasmal

Совершенно верно, даже я не знаю, откуда взялось это "от". Я пересмотрел свой код более 10 раз, изменил все, но все равно не повезло. Можете ли вы повторно исправить код, для меня будет решетка полная. Я провел небольшое исследование по поводу этой ошибки. Некоторые из них говорят, что в sql-запросе есть несколько "запятых", но до сих пор не нашли ничего подобного.

Richard Deeming

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]

Const query As String = "UPDATE faculty SET dept = @dept, sub= @sub, pre = @pre, name = @name, dob = @dob, sex = @sex, addr = @addr, city = @city, state = @state, pin = @pin, country = @country, nat = @nat, mob = @mob, email = @email, uname = @uname, pword = @pword, sec = @sec, ans = @ans, mod = @mod where id = @id"

Using command As New SqlQuery(query, connection)
    command.Parameters.AddWithValue("@dept", ComboBox1.Text)
    command.Parameters.AddWithValue("@sub", ComboBox2.Text)
    command.Parameters.AddWithValue("@pre", ComboBox3.Text)
    command.Parameters.AddWithValue("@name", TextBox2.Text
    command.Parameters.AddWithValue("@dob", DateTimePicker1.Value)
    command.Parameters.AddWithValue("@sex", ComboBox4.Text)
    command.Parameters.AddWithValue("@addr", TextBox3.Text)
    command.Parameters.AddWithValue("@city", TextBox4.Text)
    command.Parameters.AddWithValue("@state", TextBox5.Text)
    command.Parameters.AddWithValue("@pin", TextBox6.Text)
    command.Parameters.AddWithValue("@country", TextBox7.Text)
    command.Parameters.AddWithValue("@nat", TextBox8.Text)
    command.Parameters.AddWithValue("@mob", TextBox9.Text)
    command.Parameters.AddWithValue("@email", TextBox10.Text)
    command.Parameters.AddWithValue("@uname", TextBox11.Text)
    command.Parameters.AddWithValue("@pword", TextBox12.Text)
    command.Parameters.AddWithValue("@sec", ComboBox5.Text)
    command.Parameters.AddWithValue("@ans", TextBox14.Text)
    command.Parameters.AddWithValue("@mod", nDate)
    command.Parameters.AddWithValue("@id", TextBox1.Text)
    ...
End Using

Richard Deeming

Теперь вам нужно прочитать о том, как пароли должны храниться:

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]

Richard Deeming

И сделайте себе одолжение, и дайте вашим элементам управления значимые имена. Может быть ты помнишь что TextBox42 содержит сейчас но когда вы вернетесь к своему коду через шесть месяцев, вы будете проклинать человека, который его написал.

Richard Deeming

Да, и не используйте его. ExecuteReader с UPDATE, INSERT или DELETE команда. Они не возвращают никаких строк, так что читать нечего. Воспользуйся ExecuteNonQuery вместо.

2 Ответов

Рейтинг:
8

phil.o

Так как его нет FROM пункт в коде, который вы показали, я подозреваю, что метод, который выполняется, когда вы нажимаете на кнопку, не тот, который вы думаете.
Пожалуйста, проверьте название указанной кнопки в Редакторе, она должна быть Button3.
Затем поставьте точку останова в начале метода и нажмите клавишу F5; это запустит сеанс отладки. Когда вы нажмете на кнопку, метод должен быть вызван, точка останова должна быть достигнута, и оттуда вы сможете выполнить свой код построчно, нажав F10 или F11. Если точка останова не задана, это означает, что метод не вызывается, и, следовательно, это означает, что обработчик событий, зарегистрированный для события щелчка кнопки, не является правильным.

Как правило, вы должны давать своим элементам управления осмысленные имена, а не сохранять имена, назначенные редактором по умолчанию. Это предотвратило бы именно тот вид проблемы, с которым вы сталкиваетесь.

И, пожалуйста, внимательно посмотрите на решение 1, так как оно делает очень важный, если не существенный, момент о том, как строить запросы безопасным способом.


Рейтинг:
20

Patrice T

Цитата:
Неправильный синтаксис около ключевого слова 'не'.

В вашем коде нет слова "от".
Dim query As String = "UPDATE faculty SET id='" & TextBox1.Text & "',dept='" & ComboBox1.Text & "',sub='" & ComboBox2.Text & "',pre='" & ComboBox3.Text & "',name='" & TextBox2.Text & "',dob='" & DateTimePicker1.Value & "',sex='" & ComboBox4.Text & "',addr='" & TextBox3.Text & "',city='" & TextBox4.Text & "',state='" & TextBox5.Text & "',pin='" & TextBox6.Text & "',country='" & TextBox7.Text & "',nat='" & TextBox8.Text & "',mob='" & TextBox9.Text & "',email='" & TextBox10.Text & "',uname='" & TextBox11.Text & "',pword='" & TextBox12.Text & "',sec='" & ComboBox5.Text & "',ans='" & TextBox14.Text & "',mod='" & nDate & "' where id='" & TextBox1.Text & "'"

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]