#linq #linq-to-sql #dynamic-sql
#linq #linq-to-sql #dynamic-sql
Вопрос:
Почему это невозможно:
... new DB().ExecuteQuery<String>(@"Select {0} From {1} ", selectParam, tableParam);
Это приводит к следующему исключению: необходимо объявить табличную переменную «@p1».
Спасибо
Комментарии:
1.
@
Создает строковый литерал.
Ответ №1:
@ before the "" says to compiler that this is a string nothing else
Прочитайте это здесь http://msdn.microsoft.com/en-us/library/362314fe (v =vs.71).aspx
Must declare the table variable "@p0"
кажется, что все по-другому
Edited
: Не используйте имя таблицы в качестве параметра, лучше используйте только свое имя таблицы, это вызовет внедрение sql пожалуйста, прочитайте
Комментарии:
1. Спасибо, @ symbol имеет смысл, но это не причина, по которой я не могу использовать имя таблицы в качестве параметра.
Ответ №2:
Я предполагаю, что ошибка каким-то образом связана с переменными таблицы T-SQL.
строковые литералы, заключенные в @-кавычки, начинаются с @ и заключаются в двойные кавычки. Например:
@"good morning" // a string literal
Преимущество @-кавычек в том, что escape-последовательности не обрабатываются, что упрощает запись, например, полного имени файла:
@"c:DocsSourcea.txt" // rather than "c:\Docs\Source\a.txt"
Чтобы включить двойную кавычку в строку, заключенную в кавычки @, удвойте ее:
@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.
Другое использование символа @ — использовать идентификаторы, на которые ссылаются (/ reference), которые являются ключевыми словами C #. Для получения дополнительной информации см. 2.4.2 Идентификаторы.
Комментарии:
1. спасибо за ваш ответ. Я не думаю, что это проблема, поскольку я переписал код без @ — генерируется то же исключение.
Ответ №3:
Это не совсем ответ, скорее подтверждение того, что это не имеет ничего общего со строками @»» , но, похоже, это ограничение замены параметров в ExecuteSqlCommand и SqlQuery.
У меня та же проблема, что и у вас, и я обнаружил, что вы не можете указать имя таблицы в качестве параметра. У меня есть команда, имеющая вид:
Context.Database.ExecuteSqlCommand(@"Delete From MyTable WHERE MyColumn = {0}", someValue);
Это работает нормально, но если я пытаюсь предоставить MyTable в качестве параметра, это не удается.
Если вы подумаете об этом, имя таблицы на самом деле не подходит в качестве параметра, поэтому имеет смысл отклонить его. Однако я согласен с вами, что сообщение об ошибке действительно не настолько полезно.