C# 如何在WHERE子句中使用多个可选AND条件格式化查询

C# 如何在WHERE子句中使用多个可选AND条件格式化查询,c#,sql,.net,oracle,C#,Sql,.net,Oracle,我有一个用户输入表单,其中包含多个用户输入字段,需要在Oracle查询中作为参数提供。由于这些是可选参数,并且查询包含和在WHERE子句中,它需要在C类中声明许多查询字符串常量,并且为了在查询中传递参数,需要添加多个if-else或switch case。虽然它似乎工作得很好,但它使代码难以管理。有没有一种方法可以使用查询或存储过程来处理这种情况?不希望使用字符串操作动态创建查询,这可能会导致SQL漏洞 SomeConstant.cs public const string Query1 pub

我有一个用户输入表单,其中包含多个用户输入字段,需要在Oracle查询中作为参数提供。由于这些是可选参数,并且查询包含和在WHERE子句中,它需要在C类中声明许多查询字符串常量,并且为了在查询中传递参数,需要添加多个if-else或switch case。虽然它似乎工作得很好,但它使代码难以管理。有没有一种方法可以使用查询或存储过程来处理这种情况?不希望使用字符串操作动态创建查询,这可能会导致SQL漏洞

SomeConstant.cs

public const string Query1
public const string Query2
public const string Query3
public const string Query4
consumerquery.cs

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

依此类推……

您可以动态创建如下参数化查询:

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();

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

您可以动态创建如下参数化查询:

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();

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

如果对SQL查询进行参数化,则可以创建不受注入影响的动态查询。您可以使用带有条件和查询的列表并对其进行迭代->然后在条件为真的第一个列表中进行操作。这将模拟您的if/else结构。根据您的用例,您还可以使用而不是bools。如果您参数化SQL查询,则可以创建不受注入影响的动态查询。您可以使用带有条件和查询的列表,并对其进行迭代->然后在条件为真的第一个查询中使用。这将模拟您的if/else结构。根据您的用例,您也可以使用而不是bools。