LINQ-to-SQL: почему я не могу использовать имя таблицы в качестве параметра?

#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 пожалуйста, прочитайте

http://en.wikipedia.org/wiki/SQL_injection

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

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 в качестве параметра, это не удается.

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