【发布时间】:2011-09-16 07:16:37
【问题描述】:
我正在尝试使用以下签名实现 API:
public static List<string> SearchDatabase(
string column,
string value);
API 的实现需要构造一个带有WHERE 子句的SQL SELECT 查询,该子句使用column 参数中指定的列名。
查询:
string query =
string.Format(
"SELECT Name, @Column " +
"FROM Db1 " +
"INNER JOIN Db2 ON Db1.Id = Db2.Id " +
"WHERE @Column = @Value");
SQL命令和参数:
SqlCommand selectCmd =
new SqlCommand(
query,
connection);
selectCmd.CommandTimeout = SqlCommandTimeout;
selectCmd.Parameters.AddRange(
new SqlParameter[]
{
new SqlParameter("@Column", column),
new SqlParameter("@Value", value)
});
我是这样执行的:
SqlDataReader sqlDataReader = selectCmd.ExecuteReader();
while (sqlDataReader.Read())
{
// ...
}
问题是sqlDataReader 没有返回任何行,所以我没有进入上面的while 循环。
但是,如果我将上面查询的最后一行更改为:
"WHERE @Column = @Value");
到
"WHERE Vendor = @Value");
(即将列名硬编码为“供应商”)然后它就可以工作了。
从我所做的研究中我的理解是,不可能将列名作为参数传递,而只能传递我们正在查询的值。但是,它似乎让我在SELECT 子句中使用@Column 参数,而不是WHERE 子句。
由于 SQL 注入的问题,我不想求助于动态 SQL。有没有其他方法可以解决这个问题?
【问题讨论】:
-
你不能做一个
string query = string.Format("SELECT Name, " + column + " FROM Db1 INNER JOIN Db2 ON Db1.Id = Db2.Id WHERE "+Column+" = @Value");吗? ObWarning:SQL 注入! -
@Ocaso - 是的,SQL 注入是我想要避免的。
标签: c# sql sql-server-2005