Dynamic SQL with C# SqlCommand
本文关键字:SqlCommand with SQL Dynamic | 更新日期: 2023-09-27 18:11:01
我想用c#的SqlCommand
创建一个动态SQL查询,其中甚至表是一个参数,以避免注入尝试。像下图:
comm.CommandText = "SELECT * FROM @tbl WHERE cond=@cond";
comm.Parameters.AddWithValue("tbl","TABLENAME");
comm.Parameters.AddWithValue("cond","CONDITION");
然而,我发现这是不允许的。我研究过在执行时使用Dynamic SQL,但这似乎只适用于存储过程。我可以使用动态SQL来执行使用SqlCommand的表名参数吗?如果没有,如何做到这一点,以避免SQL注入问题?
谢谢!
使用SqlCommandBuilder.QuoteIdentifier
方法转义表名。
SqlCommandBuilder builder = new SqlCommandBuilder();
string tableName ="SomeTable";
string escapedTableName = builder.QuoteIdentifier(tableName);
之后,您可以在字符串中使用转义后的表名,如:
comm.CommandText = "SELECT * FROM "+ escapedTableName +" WHERE cond=@cond";
如果您的select
int表的名称是不是用户提供的,没有什么可担心的。
但是,如果您允许查询表的动态规范,则需要使用@Habib建议的QuoteIdentifier
方法,并且我强烈建议将所有可用的表名列入白名单。