2010-07-25 42 views
5

有没有办法如何做到这一点?这是行不通的:C#SqlCommand - 不能使用列名的参数,如何解决?

SqlCommand command = new SqlCommand("SELECT @slot FROM Users WHERE [email protected]; "); 
prikaz.Parameters.AddWithValue("name", name); 
prikaz.Parameters.AddWithValue("slot", slot); 

我能想到的唯一的事情就是使用SP并声明和设置列的变量。对我来说似乎有些尴尬。

+0

考虑到你的'Users'表规格化,因此解决您的问题需要将设计解决为第五种正常形式。 – onedaywhen 2010-07-26 09:33:15

回答

4

你不能在普通的SQL中做到这一点 - 如果你必须有可配置的列名(或表名),你必须使用动态SQL - 没有其他方法可以实现这一点。

string sqlCommandStatement = 
    string.Format("SELECT {0} FROM dbo.Users WHERE [email protected]", "slot"); 

,然后使用sp_executesql存储过程在SQL Server来执行SQL命令(和根据需要指定其他参数)。

动态SQL有其优点和缺点 - 阅读由SQL Server MVP Erland Sommarskog熟练编写的最终文章The Curse and Blessings of Dynamic SQL

+1

上面给出的示例代码没有演示动态SQL,它只是显示了string.Format函数的用法。正如所写,它令人困惑。 – Yellowfog 2010-07-26 05:48:51

+0

@Yellowfog:现在把这个已被格式化的字符串用于调用“sp_executesql”,并且你有你的动态SQL ..... – 2010-07-26 05:59:51

+0

那么,你有你的SQL,但它不是特别的'动态',是我的点。据我所知,它是指在事物的数据库端构建的SQL,而不是Web服务器端。或者,我是否以这种方式接受这个词是不寻常的? – Yellowfog 2010-07-26 08:43:22

7

如前所述,您无法对基本查询进行参数化,因此您必须在运行时自行构建查询。你应该白名单的这种输入,以防止注入攻击,但从根本:

// TODO: verify that "slot" is an approved/expected value 
SqlCommand command = new SqlCommand("SELECT [" + slot + 
      "] FROM Users WHERE [email protected]; ") 
prikaz.Parameters.AddWithValue("name", name); 

这样@name仍然是参数化等

相关问题