首页 > 解决方案 > 如何在 WHERE 子句中使用多个可选 AND 条件格式化查询

问题描述

我有一个用户输入表单,其中包含多个用户输入字段,需要在 Oracle 查询中作为参数提供。由于这些是可选参数,并且查询在“WHERE”子句中包含“AND”,因此需要在 C# 类中声明许多查询字符串常量,并且为了在查询中传递参数,添加多个 if-else 或 switch case。虽然它看起来运行良好,但它使代码难以管理。有没有办法使用查询或存储过程来处理这种情况?不想使用可能给 SQL 漏洞的字符串操作动态创建查询。

SomeConstant.cs

public const string Query1
public const string Query2
public const string Query3
public const string Query4

消费查询.cs

If(ConditionTrue){
  Query1;
}
else if(ConditionTrue)
{
  Query3;
} 

等等.......

标签: c#sql.netoracle

解决方案


您可以像这样动态创建参数化查询:

var parameters = new Dictionary<string, object>();
parameters["Field1"] = "Value1";
parameters["Field2"] = null;
parameters["Field3"] = 5;

StringBuilder builder = new StringBuilder("SELECT * FROM TABLE WHERE AlwaysUsedCondition=1 ");

SqlCommand cmd = new SqlCommand();

foreach (var parameter in parameters)
{
    if (!string.IsNullOrWhiteSpace(parameter.Value?.ToString()))
    {
        builder.Append(" AND " + parameter.Key + "=@" + parameter.Key);
        cmd.Parameters.Add("@" + parameter.Key, parameter.Value);
    }
}
cmd.CommandText = builder.ToString();

这不会导致任何注入漏洞,因为所有用户输入都在参数内。只需确保密钥在您的代码中并且不能从前端进行操作。


推荐阅读