Sql 将参数从值传递到查询

Sql 将参数从值传递到查询,sql,vba,ms-access-2010,Sql,Vba,Ms Access 2010,我构建了一个包含多个组合框的未绑定表单,目的是将接收到的参数传递给SQL查询。我的SQL在所有字段都包含一个值时工作,但当其中一个字段为空时,整个查询将失败。我已将每个字段的where子句设置为其各自的(tblIRS.[field]=Forms!frmSUPIR![field]或Forms!frmSUPIR![field]为NULL或tblIRS.[field]为NULL)和(… 我还尝试从未绑定的from-through变量中传递值,然后在VBA中构造SQL,但没有成功。每个字段都有一行,如下

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

我还尝试从未绑定的from-through变量中传递值,然后在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
Dim strFilter作为字符串
作为字符串的Dim strSQL
如果Nz(Me.EMP1,“”),则
strFilter=strFilter&“tblIRS.[EMP1]=”&PQ(Me.txtEMP1)&“和”。。。
strSQL=“从tblIRS中选择*_
“WHERE”和strFilter
如果结束
上述功能包括替换PQ的功能

我已经找到了许多处理上述内容的资源,但没有一个包括如何处理空表值和/或表单条目

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

例如:

  • 表单!frmSUPIR![EMP1]=[Smith,John]
  • 表格!frmSUPIR![EMP2]=[Jones,Mark]
  • Forms!frmSUPIR![EMP3]=Null
我希望查询返回EMP1=Smith、JohnEMP2=Jones、MarkEMP3的任何值的所有实例。最好的方法是什么

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


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;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var dict=新字典()
{
{“EMP1”,“史密斯,约翰”},
{“EMP2”,“琼斯,马克”},
{“EMP3”,“”}//这可能是空的,它仍然可以工作
};
Console.WriteLine(CreateWhereClause(dict));
Console.ReadKey();
}
公共静态字符串CreateWhere子句(字典键值)
{
var result=“WHERE”;
//使用lamda忽略空白值
foreach(keyValues.Where(kvp=>!String.IsNullOrWhiteSpace(kvp.Value))中的var kvPair)
{
//如果我们已经添加了一个子句,请添加一个AND
如果(结果长度>6)
结果+=“和”;
结果+=String.Format(@“tblIRS.[{0}]='{1}',kvPair.Key,kvPair.Value);
}
返回结果;
}
}

实现这一点的一个简单方法是为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
您可以对任意数量的过滤器执行此操作。如果表单中的值为null,则只会将“AND TRUE”附加到where子句


我删除了您的条件,仅当Me.Emp1不为空时才创建SQL,但可以根据需要将其放回去。

谢谢您的意见,爸爸,这似乎让我走上了正确的轨道。我在运行代码时确实遇到语法错误。特别是运行时3075。我已尝试将其设置为=真、=“真”、“真”“。有什么建议吗?我正在使用:DoCmd.OpenReport“repSUPIR”、acViewPreview、strSQL打开报告。再次感谢。我会检查最后的SQL字符串,然后尝试在VBA外部运行该字符串,以查看是否有任何错误。该错误通常是SQL语法错误。您肯定希望=“TRUE”…正如我所说的,这将生成where子句“WHERE x AND y AND z…”如果您输入=TRUE,它实际上可能会工作(如果VBA自动将布尔值转换为字符串),但这不是很好的实践。如果您输入=“那么您的WHERE子句将类似于“WHERE x AND z”,这肯定不会工作。我忽略了添加:CurrentDb.querydfs(“qryAUTO”).SQL=strSQL.现在工作得非常好。再次感谢!