syuhaiba hamizi Ответов: 2

Почему он не вставил никакого значения в базу данных?


я добавляю новый столбец(user_securitycode) в таблицу(userlogistic), и он показывает NULL. я хочу заменить это значение с помощью команды "обновить". но он просто заменяет нулевое значение и оставляет в нем пустое значение. Итак, каковы точные коды или команды, которые мне нужны, чтобы вставить новое значение?

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

Private Sub dataDisplay()
      cs.Open()
      cmd.CommandText = "SELECT * FROM userlogistic WHERE user_no = '" + Request.QueryString("id") + "'"
      cmd.Connection = cs
      reader = cmd.ExecuteReader

      If reader.HasRows Then
          While reader.Read
              uId = reader.Item("user_id").ToString()
              uRank.SelectedValue = reader.Item("user_rank").ToString()
              uname = reader.Item("user_name").ToString()
              uSec.SelectedValue = reader.Item("user_section").ToString()
              usecuritycode = reader.Item("user_securitycode").ToString()
          End While
      End If
      reader.Close()
      cs.Close()
  End Sub

  Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click

          cs.Open()
          cmd.CommandText = "UPDATE userlogistic SET" & _
              " user_id = '" & Request.Form("uid") & "', " & _
              " user_rank = '" & uRank.SelectedItem.Value & "', " & _
              " user_name = '" & Request.Form("uname") & "' , " & _
              " user_securitycode = '" & Request.Form("usecuritycode") & "' , " & _
              " user_section = '" & uSec.SelectedItem.Value & "' WHERE user_no = '" + Request.QueryString("id") + "'"

          cmd.Connection = cs
          cmd.ExecuteNonQuery()
          cs.Close()

2 Ответов

Рейтинг:
2

OriginalGriff

Только не это!
Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?


Рейтинг:
1

Henry Z.

Как сказал OriginalGriff, это плохая практика-объединять строки для построения операторов sql, однако его решение вообще не предлагает решения, а скорее представляет собой рекомендацию лучших практик в лучшем случае и, вероятно, должно было бы быть лучше опубликовано в качестве комментария.

Я посмотрел на ваш код и считаю, что проблема/проблема, с которой вы можете столкнуться, является результатом неправильного написания в приведенной ниже строке.

" user_securitycode = '" & Request.Form("usecuritycode") & "' , " & _


Не
"usecuritycode"
написано с ошибкой или это настоящее имя, указанное в вашей форме?