Почему использование запроса обновления дает мне другой результат вместо обновления данных в vb.net

#vb.net

#vb.net

Вопрос:

Я пытаюсь обновить данные в текстовом поле, и появляется эта ошибка. Это неверный запрос?

введите описание изображения здесь

   Try
        Dim Str = "UPDATE userinfo SET firstname='" amp; TextBox1.Text.ToUpper amp; "',lastname='" amp; TextBox3.Text.ToUpper amp; "'," amp;
         "WHERE id='" amp; Label15.Text
        connection.Open()
        Dim mysc2 As New MySqlCommand(Str, connection)
        mysc2.ExecuteNonQuery()
        MsgBox("User successfully updated!", MsgBoxStyle.Information)
        connection.Close()
        Me.Close()
    Catch ex As Exception
        MsgBox(ex.Message)
        connection.Close()
    End Try
 

Комментарии:

1. Очень неприятно, когда люди получают сообщение об ошибке, сообщающее им, что у них есть ошибка в их коде SQL, а затем публикуют вопрос об этом, даже не показывая этот код SQL. Обычно это происходит потому, что они сами даже не смотрели на этот SQL-код, а это значит, что они просят о помощи, не потрудившись сначала попробовать сами. Проблема не в коде VB, который создает код SQL. Это сам код SQL, поэтому используйте свои глаза, чтобы посмотреть на сам код SQL. Если вы это сделаете, проблема должна быть очевидной, и это показывает, почему построение SQL-кода таким образом плохо.

2. А также научитесь использовать параметризованные запросы, потому что есть разумный шанс, что проблема будет решена без дополнительных усилий. Практически любой ado.net учебное пособие покажет вам правильный способ написания ваших запросов

3. Кроме того, попробуйте убрать последнюю запятую перед символом WHERE

4. И если вы решите отказаться от параметризованных запросов, как предлагает ADyson (например, для упрощения отладки с помощью таких инструментов, как SQL Server Profiler), то, по крайней мере, удвойте апострофы. Если какой-то пользователь вводит '; SELECT ' все первые имена всей таблицы, они очищаются.

Ответ №1:

Как уже отмечалось, попытка объединить все эти вещи вместе не только не идеальна, но, как вы можете видеть, также очень легко испортить строку sql.

Итак, ваш sql выглядит неправильно. Это должно быть так:

 Dim Str as string
Str = "UPDATE userinfo SET firstname = '" amp; TextBox1.Text.ToUpper amp; "'," amp; _
      "lastname = '" amp; TextBox3.Text.ToUpper amp; "'" amp; _
      " WHERE id= " amp; Label15.Text
 

Теперь, конечно, мы не знаем, является ли «ID» строковым или числовым типом. И если это число, то вы НЕ окружаете Lable15.Текстовое значение в одинарных кавычках. И у вас было дополнительное «,» после текстового поля списка 3 в вашем sql.

Но, как уже отмечалось, здесь предлагается использовать параметры. Хотя это немного дополнительный код, такой код МЕНЕЕ подвержен ошибкам конкатенации, его легче читать и, фактически, легче писать. (вы можете нажать ctrl-d в редакторе кода, чтобы дублировать строку, на которой вы находитесь !!!).

и, конечно же, использование параметров ТАКЖЕ позволяет АВТОМАТИЧЕСКИ вводить данные. Так что вам не нужно беспокоиться или думать об этих дополнительных параметрах. И дело не только в том, что числа не заключены в одинарные кавычки, разделители дат могут быть даже более сложными.

Вместе без беспорядочной конкатенации? Вместе без проблемы с типом данных (кавычки или нет ????) Мы ТАКЖЕ получаем защиту от SQL-инъекций.

Итак, мы получаем по-настоящему приятный набор бонусных функций. Я ВСЕГДА сетовал на то, что многие предлагают использовать параметры, но при этом не указывают на преимущества (помимо sql-инъекции).

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

Итак, наш код может быть таким:

 Dim Str As String

Str = "UPDATE userinfo SET firstname = @firstName, lastname = @lastname WHERE id = @id"

Using cmdSQL As New MySqlCommand(Str, connection)

    cmdSQL.Parameters.Add("@firstname", SqlDbType.NVarChar).Value = TextBox1.Text
    cmdSQL.Parameters.Add("@lastname", SqlDbType.NVarChar).Value = TextBox3.Text
    cmdSQL.Parameters.Add("@id", SqlDbType.Int).Value = Label15.Text

    cmdSQL.Connection.Open()
    cmdSQL.ExecuteNonQuery()

End Using
 

Некоторые интересные вещи, на которые следует обратить внимание:
Во-первых: это действительно приятно читать, не так ли?
Второе: Легко кодируется.

Когда я набрал это:

     cmdSQL.Parameters.Add("@firstname", SqlDbType.NVarChar).Value = TextBox1.Text
 

Находясь на странице выше, я два раза нажал ctrl-d. это дублировало приведенную выше строку.

Итак, теперь я просто «наведу курсор» вверх / вниз в область значений параметров, почти как редактирование столбца в Excel. (Мне не нужно было вводить эти дополнительные строки — просто отредактируйте значения и измените значения текстового поля / метки.

И ЛУЧШЕ, когда я набираю этот код, я могу ЛЕГКО видеть и читать, просматривать красивую строку sql прямо над кодом — поэтому я просто считываю параметры по мере ввода и редактирую две строки дополнительных параметров. Так что, на самом деле, я на самом деле набираю МЕНЬШЕ, чем ваш опубликованный код. И с красивым текстом sql в поле зрения — у меня МЕНЬШАЯ нагрузка на мозг — мне не нужно запоминать параметры — я просто читаю их!

Далее:

SQL server не заботится о верхнем и нижнем регистре, поэтому вам не нужно беспокоиться о верхнем и нижнем — они будут совпадать независимо.

Далее: заключая всю сделку внутри using, нам не нужно закрывать соединение — это правильно обрабатывается блоком using (он очищает для вас).

Дальше еще больше:

И потому, что мы не используем конкатенацию строк для значений, и НАМ НЕ нужно беспокоиться о кавычках или нет, а также получаем защиту от sql-инъекций? Мы ТАКЖЕ получаем НАДЕЖНУЮ типизацию данных.

Другими словами, значения из элементов управления преобразуются в правильные типы данных, требуемые sql server. Я имею в виду, часто вы можете вставить число в кавычки в виде строки — sql server может работать, а может и нет! — но таким образом, автоматическая обработка кавычек (или отсутствие кавычек для чисел) выполняется за вас!

таким образом, обновленная исходная строка sql должна работать, но попробуйте параметры, и хотя блок using является дополнительной строкой кода, нам не нужно закрывать соединение, поэтому мы получаем обратно эту 1 строку кода!

Основная цель здесь заключается не в том, что вы должны делать это или делать это! Часто при запуске такие советы не так уж полезны. Говоря, не делай этого? Черт возьми, что это за помощь.

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

Строгая типизация данных действительно хороша, а защита от SQL-инъекций — это, по сути, бонусная функция!

Настоящим преимуществом здесь является то, что мы получили не так много кода, а код, который легче поддерживать, легче читать, и даже БОЛЬШЕ, Если мы решим в будущем добавить еще несколько текстовых полей и т. Д. В Форму.

Я имею в виду, допустим, у вас есть 4 или 5 текстовых полей. Можете ли вы себе тогда представить, насколько сложно будет редактировать, просматривать и тем более пытаться отлаживать ошибки эту длинную огромную объединенную строку!

Так обязательно ли использовать параметры? нет, вам не обязательно, но как только вы попробуете выше? Вы принимаете вышесказанное, потому что код требует меньше умственных усилий и работы с вашей стороны — и это действительно то, что такое отличный код.

Я не такой уж хороший программист, и поэтому ваш длинный строковый sql слишком сложен для меня и требует слишком больших усилий. Только действительно хорошие программисты могут разобраться в этой неразберихе. Что касается меня, вы должны думать так же, как я, как существо с одной клеткой — ограниченная мощность мозга. То же самое касается и великих игроков в пул. На самом деле они не делают сложных и сложных снимков — они настраивают себя таким образом, что им никогда не нужно делать эти сложные снимки или, в данном случае, читать и поддерживать сложный и сложный код.

Ваш код может работать, но он выходит за рамки моего уровня оплаты и способности читать и поддерживать такой код!

Удачи!