使用字符串从数据库获取列
本文关键字:获取 数据库 字符串 | 更新日期: 2023-09-27 18:16:17
我的代码:
SqlCommand command = new SqlCommand("SELECT min(Score) FROM MenAthletics WHERE [(@sportevent)] < (@result);", connect);
command.Parameters.AddWithValue("@sportevent", sportEvent);
command.Parameters.AddWithValue("@result", result);
@result工作正常(只是一个双变量)@sportevent不工作(错误:invalid columnname) (sportEvent是一个字符串)
我如何选择一个列在一个字符串给出?
可以在SQL语句中参数化值,但不能参数化列名或表名。您需要更改SQL字符串本身中的列名,例如,使用string.Format
:
SqlCommand command = new SqlCommand(
string.Format("SELECT min(Score) FROM MenAthletics WHERE [{0}] < (@result);", sportEvent)
, connect
);
command.Parameters.AddWithValue("@result", result);
确保列名不是来自用户的输入,否则会使代码受到SQL注入攻击。如果列名确实来自用户输入,则可以根据可用的表列列表验证字符串,这可以静态地进行验证,也可以在运行时检查表的结构。
您可以动态构建SQL查询,而不是将列名作为参数传递。
不能使用列名作为参数;您应该考虑这样构造查询:
SqlCommand command =
new SqlCommand(
String.Format(@"SELECT min(Score)
FROM MenAthletics WHERE [{0}] < @result;",
sportEvent),
connect);
command.Parameters.AddWithValue("@result", result);
这种类型的sql被称为"动态sql",可以是动态构造查询的有效方法。
然而,也有陷阱。除了验证用户输入,还要确保连接到数据库的用户只有足够的权限来执行您想要执行的操作。
另一种方法是使用CASE语句,这种方法不太优雅,但可以直接放在存储过程中;例如:
SELECT min(Score)
FROM MenAthletics
WHERE
CASE
WHEN @sportEvent = 'SomeColumnName' THEN SomeColumnName
WHEN @sportEvent = 'SomeColumnName2' THEN SomeColumnName2
END < @result;
在大型表上创建和维护都非常繁琐。优点是查询不是动态的。
这是因为您作为参数传递的sportEvent
字符串中的值与数据库表中存在的实际列不匹配。
确保这两个都匹配,然后只有这个错误会出现。
否则不要将表的列名作为参数传递,直接将其写入查询中,并将其列值作为参数。
希望能有所帮助。