Sql 将参数从值传递到查询
我构建了一个包含多个组合框的未绑定表单,目的是将接收到的参数传递给SQL查询。我的SQL在所有字段都包含一个值时工作,但当其中一个字段为空时,整个查询将失败。我已将每个字段的where子句设置为其各自的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,但没有成功。每个字段都有一行,如下
(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
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.现在工作得非常好。再次感谢!