VB.NET - Возникли проблемы с параметризованными запросами - PullRequest
1 голос
/ 12 июля 2011

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

command = New OleDbCommand("SELECT * FROM " + prefix + "CanonicForms WHERE Type=1 AND Canonic_Form='" + item + "'", dictionary_connection)

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

command = New OleDbCommand("SELECT * FROM @prefix WHERE Type=1 AND Canonic_Form=@form", dictionary_connection)
command.Parameters.AddWithValue("@prefix", prefix + "CanonicForms")
command.Parameters.AddWithValue("@form", item)

Но все, что я получаю, это ошибка для неполного предложения запроса. Что я сделал по-разному между этими двумя?

Ответы [ 3 ]

3 голосов
/ 12 июля 2011

Ваше имя таблицы не может быть параметром.Возможно, вам придется сделать некоторую форму конкатенации.Это не совсем параметр в формальном смысле этого слова.

1 голос
/ 12 июля 2011

@ стоимость, я согласен, что это было бы неплохо, но его просто не существует.Обычно предполагается, что ваши предложения WHERE являются динамической частью запроса, а все остальное, включая список SELECT и имя таблицы, является статическим.На самом деле, большая часть предложения WHERE даже не динамическая, а только сами значения поиска.Вы также не можете динамически добавлять имена столбцов таким способом.Это, безусловно, может быть построено, но для этого потребуется, чтобы механизм запросов был более осведомлен о механизме базы данных, который является червем, который Microsoft не хотел открывать.

Представьте себе выпадающее меню с именами таблиц, такими каккак «Работа», «Люди», «Работодатели», которые создали некоторые наивные разработчики.При обратной передаче это значение используется для SELECT * FROM.Простое внедрение SQL - это все, что нужно для перехода к другой таблице, не указанной в этом меню.А передача чего-то действительно странного может очень легко вызвать ошибку, которая может раскрыть что-то о базе данных.Параметризованные запросы, основанные только на значениях, все еще могут быть разбиты, но площадь поверхности намного меньше.

Некоторые люди с несколькими префиксами таблиц используют схемы, это вариант для вас?

1 голос
/ 12 июля 2011

Как гласит ek_ny, имя вашей таблицы не может быть параметром.

Если вы действительно параноидально относитесь к внедрению, то проверьте переданное имя таблицы по белому списку допустимых значений перед созданием строки SQL.

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