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

Почему это невозможно:

... new DB().ExecuteQuery<String>(@"Select {0} From {1} ", selectParam, tableParam);

Выдается следующее исключение: необходимо объявить табличную переменную "@ p1".

Спасибо

Ответы [ 3 ]

3 голосов
/ 05 мая 2011
@  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

0 голосов
/ 15 мая 2013

Это не совсем так, и ответ, скорее подтверждение, что это не имеет ничего общего со строками @ "", но, похоже, это ограничение подстановки параметров в ExecuteSqlCommand и SqlQuery.

У меня та же проблема, что и у вас, и я обнаружил, что вы не можете указать имя таблицы в качестве параметра.У меня есть команда, которая имеет вид:

Context.Database.ExecuteSqlCommand(@"Delete From MyTable WHERE MyColumn = {0}", someValue);

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

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

0 голосов
/ 05 мая 2011

Я предполагаю, что ошибка как-то связана с табличными переменными T-SQL .


@ - строковые литералы в кавычках начинаются с @ и заключаются в двойные кавычки. Например:

@"good morning"  // a string literal

Преимущество @ -цитирования в том, что escape-последовательности не обрабатываются, что позволяет легко написать, например, полное имя файла:

@"c:\Docs\Source\a.txt"  // rather than "c:\\Docs\\Source\\a.txt"

Чтобы включить двойную кавычку в строку с @ кавычками, удвойте ее:

@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.

Другое использование символа @ - использование ссылочных ( / reference ) идентификаторов, которые являются ключевыми словами C #. Для получения дополнительной информации см. 2.4.2 Идентификаторы .

...