#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 "'";