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注入问题?

谢谢!

Dynamic SQL with C# SqlCommand

使用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方法,并且我强烈建议将所有可用的表名列入白名单。