如何在连接到 MS SQL 服务器的 MS Access“Pass Trough”查询中使用组合框输入正确编写 WHERE 语句
Posted
技术标签:
【中文标题】如何在连接到 MS SQL 服务器的 MS Access“Pass Trough”查询中使用组合框输入正确编写 WHERE 语句【英文标题】:How to properly write the WHERE statement with combobox input in MS Access "Pass Trough" query which is connected to MS SQL server 【发布时间】:2020-04-08 11:45:43 【问题描述】:我正在尝试在 MS Access 中创建一个传递槽查询,该查询将连接到 SQL 服务器,并使用表单中的组合框作为 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”。
如果你能帮助我,我将非常感激。
【问题讨论】:
【参考方案1】:你没有。
传递查询按原样传递到数据源,Access 根本不对其进行解析。这意味着无法在传递查询中使用基于表单的参数。
改为使用 VBA 设置参数。
有关如何执行此操作,请参阅How do I use parameters in VBA in the different contexts in Microsoft Access?。具体来说,DAO 部分适用于直通查询。
这也意味着您无法打开查询进行显示。使用 VBA 在数据表视图中使用表单来设置自己的记录集。请注意,如果记录集需要重新查询参数,这可能会导致排序/过滤出现问题。
【讨论】:
【参考方案2】:直通查询意味着它是在服务器端执行的。该服务器无法再查看访问权限并提取数据,然后尝试窃取您计算机上的所有电子邮件或财务数据。
那么简单的解决方案是在将表达式发送到 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]
所以其他代码将是相同的 - 上面唯一的变化是我省略了在表达式周围添加引号 (')。
【讨论】:
【参考方案3】:非常感谢您的帮助。
最后我做了不同的事情。我通过 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
【讨论】:
以上是关于如何在连接到 MS SQL 服务器的 MS Access“Pass Trough”查询中使用组合框输入正确编写 WHERE 语句的主要内容,如果未能解决你的问题,请参考以下文章
如何让 ms-access 以其他用户身份连接到 ms-sql?
如何将 AWS ELB 连接到运行 MS SQL 的 RDS?
Node 在连接到 Postgres 方面比 .NET Core 快 20 倍