Использование переменных в запросах SQL в asp.net (C #) - PullRequest
6 голосов
/ 02 мая 2011

У меня есть SQL-запрос этой формы

string cmdText = "Select * from " + searchTable 
  + "WHERE " + searchTable 
  + "Name =' " +   searchValue + "'";

По сути, я пытаюсь получить информацию о конкретном актере из таблицы актеров базы данных. Переменная searchTable имеет значение «Actor», которое является именем таблицы, а searchValue имеет имя актера (которое представлено атрибутом ActorName в таблице Actor, здесь я пытаюсь сформировать имя атрибута путем объединения слов «Actor» 'и' Имя ')

Итак, вся эта конкатенация приводит (или, по крайней мере, должна привести) к запросу формы:

Select * from Actor where ActorName ='some actor';

Но когда я пытаюсь запустить это, в браузере выдается ошибка "Неверный синтаксис рядом с '='". Может ли кто-нибудь помочь, пожалуйста?

Ответы [ 4 ]

8 голосов
/ 02 мая 2011

Вы можете поместить (и должны !) Параметры в свои SQL-запросы для значений, например, в. ваше WHERE предложение - но вы не можете параметризировать такие вещи, как имя вашей таблицы.

Так что я бы переписал этот запрос:

SELECT (list of columns)
FROM dbo.Actor
WHERE ActorName = @ActorName

, а затем передать только значение для @ActorName.

Если вам нужно сделать то же самое для директоров, вам потребуется второй запрос

SELECT (list of columns)
FROM dbo.Directors
WHERE DirectorName = @DirectorName

Использование таких параметров, как этот

  • повышает безопасность (запрещает атаки с использованием SQL-инъекций!)
  • повышает производительность: план запроса для этого запроса можно кэшировать и использовать повторно для второго, третьего прогона

PS: исходная проблема в вашей настройке заключается в следующем: у вас нет пробела между первым появлением имени таблицы и предложением WHERE - таким образом вы получите:

SELECT * FROM ActorWHERE ActorName ='.....'

Если вы действительно настаиваете на объединении вашего оператора SQL (я бы НЕ рекомендовал его!), То вам нужно поставить пробел между именем таблицы и вашим WHERE!

Обновление: некоторые ресурсы для изучения параметризованных запросов в ADO.NET:

5 голосов
/ 02 мая 2011

Не следует объединять строки в SQL, так как это откроет вам до Атаки SQL-инъекций .

Это довольно длинное прочтение о динамическом SQL, но его стоит прочитать, чтобы понять риски и варианты.

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

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


Ошибка, которую вы видите, является результатом конкатенации, которую вы делаете с предложением «Где» - перед ней пропущен пробел. Вы также добавляете пробел после ' в параметре, оканчивающемся на «Имя».

Ваша полученная строка, используя ваш пример, будет:

Select * from ActorWHERE ActorName =' some actor';
1 голос
/ 02 мая 2011

Отсутствует пробел, и его слишком много:

searchTable + "Name =' "

должно читаться

searchTable + " Name ='"

Кроме того, используйте параметры SQL для предотвращения внедрения SQL.

0 голосов
/ 02 мая 2011
string cmdText = "Select * from " + searchTable + " WHERE Name = '" +   searchValue + "'";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...