为什么不可能:
... new DB().ExecuteQuery<String>(@"Select {0} From {1} ", selectParam, tableParam);
这会抛出如下异常:必须声明表变量"@p1".
谢谢
@ 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注入,请阅读
我猜这个错误与T-SQL表变量有关。
@用双引号括起来,以@开头。例如:
@"good morning" // a string literal
@-引号的优点是不处理转义序列,这使得编写(例如,完全限定文件名)变得容易:
@"c:DocsSourcea.txt" // rather than "c:\Docs\Source\a.txt"
要在@引号字符串中包含双引号,请将其双引号括起来:
@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain.
@符号的另一个用途是使用引用(/reference)标识符,而这些标识符恰好是c#关键字。更多信息请参见2.4.2标识符。
这不是完全的答案,更多的是确认它与@"字符串无关,但它似乎是ExecuteSqlCommand和SqlQuery中的参数替换的限制。
我有和你一样的问题,发现你不能提供表名作为参数。我有一个命令的形式是:
Context.Database.ExecuteSqlCommand(@"Delete From MyTable WHERE MyColumn = {0}", someValue);
这工作得很好,但如果我试图提供MyTable作为参数,它会失败。
如果你考虑一下,表名不适合作为参数,所以拒绝它是有道理的。然而,我同意你的观点,错误信息真的没有那么有用。