Пытаясь обновить запись, продолжайте получать эту ошибку vb.net - PullRequest
0 голосов
/ 07 ноября 2011

Я уверен, что этот вопрос будет легким для вас много ... :) Я просто пытаюсь обновить существующую запись в моей базе данных, используя следующее:

    Private Sub Button12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click

    If Not cnn.State = ConnectionState.Open Then
        cnn.Open()
    End If

    cmd2.Connection = cnn
    cmd2.CommandText = "UPDATE HireItemRecord SET HireItemBeginDate = " & TextBox45.Text & _
     " ,HireItemEndDate = " & TextBox44.Text & _
     " ,HireItemCost = " & TextBox16.Text & _
     " ,PaymentMethod = " & TextBox17.Text & _
     " ,Staff_Id = " & TextBox19.Text & _
     " ,HireItemNotes = " & TextBox18.Text & _
     " ,HireItemReturnDate = " & TextBox43.Text & _
     "WHERE HireRecord_Id = " & TextBox13.Text

    cmd2.ExecuteNonQuery()

    ds1.Clear()
    daHireItemRecord.Fill(ds1, "PersonDetails")
    cnn.Close()

End Sub

Однако, независимо от того, какая запись выбрана, и какие бы данные ни были в полях, я получаю эту ошибку снова и снова: SqlException был необработан Неверный синтаксис около '12'.

Когда в текстовых полях нет абсолютно ничего, ошибка меняется на: Неверный синтаксис рядом с ','.

Я очень новичок в этом, и я просто не могу понять, почему это происходит. Большое спасибо за Вашу помощь. :)

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

Слишком много неправильного в этом.

  1. Вам нужен пробел после каждой запятой, а не перед ней.
  2. Вы должны экранировать свои значения перед использованием их в запросе.Если я добавлю «0, ГДЕ 1 = 1 -» в любое из ваших текстовых полей, это уничтожит всю вашу таблицу.
  3. Вы должны ВСЕГДА правильно называть элементы управления формы.Если я отправлю вам этот код через год и скажу, что есть проблема с TextBox44, знаете ли вы, что это значит?То же самое касается ваших переменных.Иногда хорошо иметь i, x или tbl для имени переменной, но в целом они должны быть описательными.

Пример для # 2, где я поместил "1/1/1999 'WHERE 1 = 1 -" в TextBox45:

`UPDATE HireItemRecord SET HireItemBeginDate = '1/1/1999' WHERE 1=1 -- , HireItemEndDate...`

Все, что после -- становится комментарием, так что вы получитеэто:

 `UPDATE HireItemRecord SET HireItemBeginDate = '1/1/1999' WHERE 1=1`

Можете ли вы представить, что произойдет, если я выполню этот запрос?Ничего хорошего.

Вы должны использовать параметризованные запросы согласно рекомендациям в этом вопросе: Алгоритм, чтобы избежать внедрения SQL на MSSQL Server из кода C #?

0 голосов
/ 07 ноября 2011

Никогда не следует использовать конкатенацию строк для построения SQL.Это оставляет вас открытыми для атак SQL-инъекций.Попробуйте использовать SQLCommand объект , предоставленный в .Net.Это позволяет вам «параметризовать» ваш запрос, и вам не нужно беспокоиться о том, куда поместить «и».

Это также позволит вам добавлять параметры естественным образом без необходимости преобразования их в строки.:

Dim command As New SqlCommand("SELECT * FROM Table", connection)
command.Parameters.Add("@ID", SqlDbType.Int)
command.Parameters("@ID").Value = customerID

Я украл этот код из документации о Параметры SQL здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...