0 голосов
спросил от в категории VBNET
Простой: не делайте этого так. Никогда не связывайте строки для создания команды SQL. Это дает вам широкое распространение для случайной или преднамеренной атаки SQL Injection, которая может уничтожить всю вашу базу данных. Всегда используйте Параметрированные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что 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';
Совершенно корректный SELECT
DROP TABLE MyTable;
Совершенно корректная команда «удалить таблицу»
--'
И все остальное - комментарий.
Таким образом, он: выбирает любые соответствующие строки, удаляет таблицу из БД и игнорирует что-либо еще.

Таким образом, ВСЕГДА используйте параметризованные запросы! Или будьте готовы регулярно восстанавливать свою БД из резервной копии. Вы делаете резервные копии регулярно, не так ли?


Здесь много других вещей, которые плохо делают: как сказал Дэйв, используя Form1 все время - плохая идея, так как используется общий объект Command, магические числа в вашем доступе к данным считывателя, которые вы не проверяете, какие-либо данные вообще возвращаются ... В принципе, везде, где вы скопировали этот код от него он идиот, который ничего не знает о том, как правильно закодировать код, и вы могли бы получить целую нагрузку, чтобы просто удалить свой «код» и начать с нуля.

Это правильно обработанный запрос:
Using con As New SqlConnection(strConnect) con.Open() Using cmd As New SqlCommand("SELECT iD, description FROM myTable WHERE ProductName = @PRODNAME", con)         cmd.Parameters.AddWithValue("@PRODNAME", itemdesc) Using reader As SqlDataReader = cmd.ExecuteReader() While reader.Read() Dim id__1 As Integer = CInt(reader("iD")) Dim desc As String = DirectCast(reader("description"), String) Console.WriteLine("ID: {0}" & vbLf & "    {1}", iD, desc) End While End Using End Using End Using
Теперь используйте этот шаблон во всем приложении - или потеряйте свою базу данных ...

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
0 голосов
ответил от
Вы должны указать строковые значения в командах SQL:
Form1.cmd = New SqlClient.SqlCommand("SELECT * FROM Inventory WHERE [ItemDescription] ='" + Form1.itemdesc + "'", Form1.sqlConnection1)
В противном случае они рассматриваются как имена полей или команды SQL.
br> Этого не произошло бы при использовании параметризованных запросов, предложенных OrginalGriff в его решении.
Сделайте это, как он предлагает вместо того, чтобы исправить свой код, используя приведенный выше фрагмент. Единственная цель этого сообщения - объяснить, что приводит к сообщению об ошибке.
0 голосов
ответил от
Во-первых, вам не нужно набирать «Form1» все время, если этот код является частью класса Form1.

Далее, запуск кода под отладчиком остановит код в строке, которая занесла исключение. Выбранная вами строка не может быть той, которая ее выбрала, потому что она не упоминает «Кружки» в любом месте, и вы, похоже, не добавили никаких параметров в объект SqlCommand.

Категории

Добро пожаловать на сайт DraftingCode Q&A (ИТ ответы), где вы можете задавать вопросы и получать ответы от других членов сообщества.

Связанных вопросов не найдено

...