c# - 如何将 SQL 列别名指定为 SqlParameter?
问题描述
是否可以将列的别名添加为SqlParameter
SQL 命令?如果是这样,它是如何指定的?
作为一个简化的例子,假设我有一个这样构造的 SQL 命令:
SqlCommand GetCommand(string columnName)
{
string filter = String.Format("SELECT MyColumn1 AS '{0}' FROM MyTable", columnName);
return new SqlCommand(filter);
}
这个命令对防止 SQL 注入攻击没有任何作用,所以我想遵循标准过程并参数化命令。
我习惯于将 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;
}
但是,当命令执行时,它会导致:
MyApplication.exe 中出现“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理
附加信息:“@columnName”附近的语法不正确。
我看到在 SO 和网络上有很多关于使用的问题SqlParameter
,但似乎没有一个涉及到它们与列别名的使用。
Microsoft 的 SqlParameter 文档中也没有任何指示。由此,我注意到该SqlParameter.Direction
属性默认为ParameterDirection.Input
; 列别名用于输出,所以我尝试了InputOutput
and Output
,但它对结果没有影响。
解决方案
简短的回答:你不能。
列别名不可参数化。它们是 SQL 语言中的标识符,而不是值——就像列名本身或表名一样。
“从表 Y 中获取我的列 X,并在结果集中将其命名为 Z。” X、Y 或 Z 都不是可参数化的。
请注意,这不是SqlParameter
对 SQL 语言的限制,而是由 Sql Server 实现的。
推荐阅读
- reactjs - 如何替换 UNSAFE_componentWillReceiveProps
- xml - 使用 sed/awk/grep 匹配段落并替换为新段落
- c - 如何编写将 0xFF 置于匹配通道中的 SWAR 比较?
- javascript - 使用 Webpack Encore 导入 Bootstrap 和插件 Carousel
- delphi - 如何将 Viewport3D 保存为图像文件?
- python - 我怎样才能让两个循环都运行,因为我希望能够同时移动两个射手
- r - 将序列添加到现有时间序列的最有效方法是什么?
- menu - QBasic (QB64) 制作的主菜单?
- python - 折叠python pandas数据框中的重叠日期
- angular - 如何将矩阵中的对象转换为另一种类型?