将参数从值传递给查询

Passing Parameter from values to Query

我构建了一个带有多个组合框的未绑定表单,目的是将接收到的参数传递给 SQL 查询。当所有字段都包含一个值时,我的 SQL 可以工作,但是当一个字段为空时,整个查询将失败。我已将每个字段的 where 子句设置为其各自的 (tblIRS.[Field]=Forms!frmSUPIR![Field] OR Forms!frmSUPIR![Field] IS NULL OR tblIRS.[Field] IS NULL) AND (...

我也曾尝试通过变量传递未绑定的值,然后在 VBA 中构造 SQL 也无济于事。每个字段都有类似于下面的在线:

Dim strFilter As String
Dim strSQL As String 
    If Nz(Me.EMP1, "") <> "" Then
    strFilter = strFilter & "tblIRS.[EMP1] = '" & PQ(Me.txtEMP1) & "' And " ... 
    strSQL = "SELECT * FROM tblIRS " & _
             "WHERE" & strFilter
 End If

以上包含替换PQ的功能

我找到了许多处理上述问题的资源,但 none 包括如何处理空 table 值 and/or 表单条目。

我的目标是让用户通过使用尽可能少的组合框来缩小搜索范围。理想情况下,表单将接受组合框中的空值作为空值处理,而不显示该字段具有空值 table 的所有记录。

例如:

我希望查询 return EMP1 = Smith, John AND EMP2 = Jones, Mark AND[=41= 的所有实例] 任意 EMP3 值。解决此问题的最佳方法是什么?

希望我说得够清楚,提前谢谢你,

JS

这里有一个小控制台应用程序和创建 WHERE 子句的方法。您无需担心生成的 where 子句中的 EMP3,因为任何值都是可接受的。

class Program
{
    static void Main(string[] args)
    {
        var dict = new Dictionary<string, string>()
        {
            { "EMP1", "Smith, John" },
            { "EMP2", "Jones, Mark" },
            { "EMP3", "" }          //This could be null and it would still work

        };

        Console.WriteLine(CreateWhereClause(dict));
        Console.ReadKey();
    }

    public static string CreateWhereClause(Dictionary<string, string> keyValues)
    {
        var result = "WHERE ";

        //Ignore blank values using lamda
        foreach (var kvPair in keyValues.Where(kvp => !String.IsNullOrWhiteSpace(kvp.Value)))
        {
            //If we've already added a clause, add an AND
            if (result.Length > 6)
                result += " AND ";

            result += String.Format(@"tblIRS.[{0}] = '{1}'", kvPair.Key, kvPair.Value);
        }
        return result;
    }
}

实现此目的的一个简单方法是为 where 子句的每个部分创建一个不同的变量:

Dim strWhereEmp1 As String
Dim strWhereEmp2 As String
Dim strWhereEmp3 As String
Dim strFilter As String

If IsNull(Me.EMP1) Then /*Or use If Nz(Me.Emp1, "") = "" if you wish*/
     strWhereEmp1 = "TRUE"
Else
     strWhereEmp1 = "tblIRS.[EMP1] = '" & Me.Emp1 & "'"
End If
If IsNull(Me.EMP2) Then
     strWhereEmp2 = "TRUE"
Else
     strWhereEmp2 = "tblIRS.[EMP2] = '" & Me.Emp2 & "'"
End If
If IsNull(Me.EMP3) Then 
     strWhereEmp3 = "TRUE"
Else
     strWhereEmp3 = "tblIRS.[EMP3] = '" & Me.Emp3 & "'"
End If
strFilter = strWhereEmp1 " AND " & strWhereEmp2 & _
                         " AND " & strWhereEMp3 

strSQL = "SELECT * FROM tblIRS " & _
         "WHERE " & strFilter

您可以对任意数量的过滤器执行此操作。如果表单中的值为空,它只会将“AND TRUE”附加到 where 子句。

我删除了你的条件,如果 Me.Emp1 不为空,我只创建 SQL,但可以根据需要放回去。