将参数从值传递到Query

时间:2015-12-29 22:48:15

标签: sql vba ms-access-2010

我构建了一个带有多个组合框的未绑定表单,目的是将收到的参数传递给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的功能。

我找到了许多资源来处理上述内容但没有包含如何处理空表值和/或表单条目的资源。

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

例如:

  • 表格!frmSUPIR![EMP1] = [史密斯,约翰]
  • 表格!frmSUPIR![EMP2] = [琼斯,马克]
  • 表格!frmSUPIR![EMP3] =空

我希望让查询返回EMP3的所有实例,其中EMP3为EMP3,约翰 AND EMP2 =琼斯,标记 AND ANY 。最好的方法是什么?

希望我很清楚,并提前感谢你,

JS

2 个答案:

答案 0 :(得分:1)

实现此目的的一种简单方法是为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

您可以为任意数量的过滤器执行此操作。它只会贴上&#34;和真#34;如果表单中的值为null,则返回where子句。

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

答案 1 :(得分:0)

这是一个用于创建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;
    }
}