将参数从值传递给查询
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 的所有记录。
例如:
- Forms!frmSUPIR![EMP1] = [史密斯,约翰]
- Forms!frmSUPIR![EMP2] = [琼斯,马克]
- 表格!frmSUPIR![EMP3] = 空
我希望查询 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,但可以根据需要放回去。
我构建了一个带有多个组合框的未绑定表单,目的是将接收到的参数传递给 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 的所有记录。
例如:
- Forms!frmSUPIR![EMP1] = [史密斯,约翰]
- Forms!frmSUPIR![EMP2] = [琼斯,马克]
- 表格!frmSUPIR![EMP3] = 空
我希望查询 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,但可以根据需要放回去。