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

Tho*_*mas 6 c# sql sql-server-2005

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

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

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

Mar*_*ell 10

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

// 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);
Run Code Online (Sandbox Code Playgroud)

这种方式@name仍然是参数化等.


mar*_*c_s 6

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

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

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

动态 SQL 有其优点和缺点 - 阅读由 SQL Server MVP Erland Sommarskog 专业撰写的关于动态 SQL 的诅咒和祝福的终极文章。

  • 您上面给出的示例代码没有演示动态 SQL,它只是演示了 string.Format 函数的使用。正如所写的那样令人困惑。 (2认同)