c# - 如何在 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;
}
等等.......
解决方案
您可以像这样动态创建参数化查询:
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();
这不会导致任何注入漏洞,因为所有用户输入都在参数内。只需确保密钥在您的代码中并且不能从前端进行操作。
推荐阅读
- angular - 角度定位混乱
- symfony - 使用 Sonata Admin 进行用户/组/角色管理
- vbscript - vbscript 不会正确执行“如果”
- selenium - 如何在 Tosca 中再次使用随机表达式?
- ansible - 如何强制 Ansible 中的变量只有 3 个字符或只有数字?
- swiftui - SwiftUI 初始化将存储在 UserDefaults 中的变量
- sql - 如何在没有不符合条件的重复项的情况下进行 JOIN?
- javascript - 如何将对象添加到现有的对象数组
- python - 与熊猫外部合并时出现重复问题
- pyqt - 使用 QTextEdit.clear() 时,PyQt6 无法为位于不同线程中的父级创建子级