gpt4 book ai didi

c# - 如何将 SQL 列别名指定为 SqlParameter?

转载 作者:太空宇宙 更新时间:2023-11-03 20:53:55 29 4
gpt4 key购买 nike

是否可以将列的别名作为 SqlParameter 添加到 SQL 命令中?如果是这样,它是如何指定的?

作为一个简化的例子,假设我有一个这样构造的 SQL 命令:

SqlCommand GetCommand(string columnName)
{
string filter = String.Format("SELECT MyColumn1 AS '{0}' FROM MyTable", columnName);

return new SqlCommand(filter);
}

这个命令对防止 SQL 注入(inject)攻击没有任何作用,所以我想按照标准程序对命令进行参数化。

我习惯于将 WHERE 子句中的语句转换为使用参数。语句类似于上面的语句,例如:

SqlCommand command("SELECT * FROM MyTable WHERE name = '{0}'", name);

当我转换它时,它变成:

SqlCommand command("SELECT * FROM MyTable WHERE name = @name");
command.Parameters.Add(new SqlParameter("name", SqlDbType.NVarChar) { Value = name });

效果很好。在此处对 GetCommand() 方法采用相同的方法可得出:

SqlCommand GetCommand(string columnName)
{
string filter = "SELECT MyColumn1 AS @columnName FROM MyTable";

SqlCommand command = new SqlCommand(filter);
command.Parameters.Add(new SqlParameter("columnName", SqlDbType.NVarChar)
{ Value = columnName });

return command;
}

但是,当命令被执行时,结果是:

An exception of type 'System.Data.SqlClient.SqlException' occurred in MyApplication.exe but was not handled in user code

Additional information: Incorrect syntax near '@columnName'.

我看到在 SO 和网络上有很多关于 SqlParameter 使用的问题,但似乎没有一个涉及到它们与列别名的使用。

Microsoft's SqlParameter documention 中没有任何指示任何一个。由此,我注意到 SqlParameter.Direction 属性默认为 ParameterDirection.Input;列别名用于输出,所以我尝试了 InputOutputOutput,但对结果没有影响。

最佳答案

简短回答:你不能

列别名不可参数化。它们是 SQL 语言中的标识符,而不是值 - 就像列名本身或表名一样。

“从表 Y 中获取列 X,并在结果集中将其命名为 Z。” X、Y 或 Z 均不可参数化。

请注意,这不是 SqlParameter 的限制,而是 Sql Server 实现的 SQL 语言的限制。

关于c# - 如何将 SQL 列别名指定为 SqlParameter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52522017/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com