LINQ-to-SQL:为什么我不能使用表名作为参数?

时间:2011-05-05 09:40:15

标签: linq linq-to-sql dynamic-sql

为什么这是不可能的:

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

这会引发以下异常:必须声明表变量“@ p1”。

谢谢

3 个答案:

答案 0 :(得分:3)

@  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 :(得分:0)

我猜错误与T-SQL Table Variables有关。


@ - 引用的字符串文字以@开头,并用双引号括起来。例如:

@"good morning"  // a string literal

@ -quoting的优点是不处理转义序列,这使得它易于编写,例如,完全限定的文件名:

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

要在@ -quoted字符串中包含双引号,请将其加倍:

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

@符号的另一个用途是使用恰好是C#关键字的引用(/reference)标识符。有关详细信息,请参阅2.4.2 Identifiers

答案 2 :(得分:0)

这不完全和回答,更确认它与@“”字符串没有任何关系,但它似乎是ExecuteSqlCommand和SqlQuery中参数替换的限制。

我遇到与您相同的问题,发现您无法提供表名作为参数。我有一个以下形式的命令:

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

工作正常,但如果我尝试将MyTable作为参数提供,则会失败。

如果您考虑一下,表名实际上并不适合作为参数,因此拒绝它是有意义的。但是我同意你的看法,错误信息真的没那么有用。