如何在连接到MS SQL服务器的MS Access "Pass Trough"查询中正确编写具有组合框输入的WHERE语句



我正试图在MS Access中创建一个直通查询,该查询将连接到SQL server,并使用表单中的组合框作为WHERE语句部分的筛选参数。

我知道连接和一切工作,因为如果我进入

SELECT * FROM mrch.Promo_Request_Base

我收到了所有的结果。

现在,当我尝试输入类似的内容时

SELECT * FROM mrch.Promo_Request_Base WHERE mrch.Promo_Request_Base.Requestor_Name = 'UserABC';

那么它也起作用。

如果我像这样输入SQL,它对我不起作用:

SELECT * 
FROM mrch.Promo_Request_Base
WHERE (((mrch.Promo_Request_Base.Requestor_Name) = [Forms]![f_PromoRequest_VIEW_Header_001a]![Combo133]));

我也试过这个:

SELECT *
FROM mrch.Promo_Request_Base
WHERE (((mrch.Promo_Request_Base.Requestor_Name) = [Forms]![f_PromoRequest_VIEW_Header_001a]![Combo133].Columns(0)));

[Combo133]中包含值"UserABC"。

如果你能帮助我,我将不胜感激。

您没有。

传递查询按原样传递给数据源,Access根本不会对其进行解析。这意味着无法在传递查询中使用基于表单的参数。

相反,请使用VBA来设置参数。

有关如何执行此操作的信息,请参阅如何在Microsoft Access的不同上下文中使用VBA中的参数?。具体来说,关于DAO的部分适用于传递查询。

这也意味着您无法打开查询进行显示。使用VBA在数据表视图中使用窗体设置自己的记录集。请注意,如果记录集需要重新查询参数,这可能会导致排序/筛选出现问题。

传递查询意味着它在服务器端执行。该服务器不能再去查看访问和提取数据,然后去尝试窃取你电脑上的所有电子邮件或财务数据。

简单的解决方案是在将表达式发送到sql server之前对其进行"处理"或"评估"。您可以使用以下内容:

Dim strSQL     As String
strSQL = "SELECT * From mrch.Promo_Request_Base " & _
"WHERE mrch.Promo_Request_Base.Requestor_Name = '" & _
[Forms]![f_PromoRequest_VIEW_Header_001a]![Combo133] & "'"
With CurrentDb.QueryDefs("qryPass")
.SQL = strSQL
End With
' now code here to open form, or say launch report
DoCmd.OpenReport "rptPromoList", acViewPreview

请注意,您必须确保服务器端的sql格式正确。

所以,在上面,我假设Requestor_Name是一个文本类型的字段。所以,这意味着你必须在表达式周围加引号(我用的是单引号(。如果你从组合框中得到的列是一个数字,那么不需要引号,你可以使用这个:

strSQL = "SELECT * From mrch.Promo_Request_Base " & _
"WHERE mrch.Promo_Request_Base.Requestor_Name = " & _
[Forms]![f_PromoRequest_VIEW_Header_001a]![Combo133]

所以其他代码也是一样的——上面唯一的变化是我省略了在表达式周围添加引号('(的做法。

非常感谢您的帮助。

最后,我的做法有所不同。我正在通过VBA更改PassTrough查询:

Private Sub Command159_Click()
Dim db As dao.Database
Set db = CurrentDb
Dim qdf As dao.QueryDef
Set qdf = db.QueryDefs("q_PassThrough_VIEW_001a")

qdf.SQL = "SELECT * From mrch.Promo_Request_Last_Version_rpt_v " & _
"WHERE mrch.Promo_Request_Last_Version_rpt_v.F_Qtr_CD LIKE '" & _
[Forms]![f_PromoRequest_VIEW_Header_001a]![Combo145] & "%'" 
qdf.Close
db.Close
Set qdf = Nothing
Set db = Nothing
End Sub

相关内容

  • 没有找到相关文章

最新更新