我有一个用于在Oracle中搜索记录的动态SQL,VS2017代码分析报告有关对此行使用参数化SQL查询的警告(第1行,此代码有效):
string SQL = "SELECT " + string.Join(",", my_columns.ToArray()) + " FROM MyTable ";
string where_condition = " WHERE ";
//the rest of code follows as this...
if (!string.IsNullOrEmpty(textbox1.Text))
{
SQL = string.Concat(SQL, where_condition, " Name like :name");
cmd.Parameters.Add(new OracleParameter("name", string.Concat("%", textbox1.Text, "%")));
where_condition = " AND ";
} //...
所以,由于警告,我试图将列名作为参数,但后来我得到了ORA-01036-非法变量名/号错误:
string SQL = "SELECT :columns FROM MyTable ";
cmd.Parameters.Add(new OracleParameter("columns", string.Join(",",
my_columns.ToArray())));
string where_condition = " WHERE ";
有什么问题,列名不能作为参数传递?或者还有其他方法可以避免在VS代码分析中发出警告吗?
答案 0 :(得分:0)
你是对的 - 列名不能作为参数传递。除非您想要非常显着地更改数据库结构,否则该部分必须动态完成。 (你可以有一个列,其值为逻辑列名,值为一列。我' m 不推荐这个 - 它不是数据库的方式打算使用。)
您要获得的警告是为了避免SQL注入攻击。在动态构建查询时,您必须以不同方式执行此操作。您基本上需要确保您拥有列名称的白名单,并且只构建包含这些名称的SQL。
此时您仍然可能会收到代码分析警告,但是您应该为这段代码禁用 ,并附上评论说明您了解警告,以及您是什么&#39已经完成以消除SQL注入攻击的风险。