C#SqlCommand – 不能使用参数作为列名,如何解决?

有什么方法可以做到吗? 这不起作用:

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

我唯一能想到的是使用SP并声明并设置列的变量。 对我来说有点尴尬。

您不能在常规SQL中执行此操作 – 如果您必须具有可配置的列名(或表名,就此而言),则必须使用动态SQL – 没有其他方法可以实现此目的。

 string sqlCommandStatement = string.Format("SELECT {0} FROM dbo.Users WHERE name=@name", "slot"); 

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

动态SQL有它的优点和缺点 – 阅读由SQL Server MVP Erland Sommarskog专业编写的关于动态SQL的诅咒和祝福的最终文章。

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

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

这样@name仍然是参数化等。