Использование переменных в SQL-запросах в asp.net (C #)

#c# #asp.net #sql

#c# #asp.net #sql

Вопрос:

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

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

В основном, что я пытаюсь сделать, это получить информацию о конкретном субъекте из таблицы Actors базы данных. Переменная searchTable имеет значение ‘Actor’, которое является именем таблицы, а searchValue имеет имя субъекта (которое представлено атрибутом ActorName в таблице Actor, здесь я пытаюсь сформировать имя атрибута путем объединения слов ‘Actor’ и ‘Name’).

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

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

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

Ответ №1:

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

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

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

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

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

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

Использование параметров, подобных этому

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

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

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

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

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

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

1. Спасибо за подробный ответ, я очень, очень новичок в asp.net и c #, и наш инструктор только что выполнили конкатенацию с нами. Тем не менее, я хотел бы узнать больше о параметризованных запросах, я погуглил, но не смог найти удовлетворительного введения, что-нибудь с примерами кода, есть ли ссылка, на которую вы могли бы меня направить? В любом случае, большое спасибо за вашу помощь!

2. @QPTR: добавлены некоторые ссылки на ресурсы

Ответ №2:

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

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

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

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


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

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

 Select * from ActorWHERE ActorName =' some actor';
  

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

1. Спасибо за ссылки! Я попробую их использовать.

Ответ №3:

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

 searchTable   "Name =' "
  

следует прочитать

 searchTable   " Name ='"
  

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

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

1. Спасибо за ответ, я не заметил пробелов, теперь это работает.

Ответ №4:

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