简体   繁体   English

与And子句SQL,Access-VBA一起使用

[英]Where with And Clause SQL, Access-VBA

运行时错误消息

Hi Everyone, Another Installment of WTF am I missing? 大家好,我想念另一部分WTF吗? When I run this code I get a missing operator run-time Error, see attached photo. 当我运行此代码时,出现缺少的操作员运行时错误,请参见所附照片。

I can't seem to figure it out. 我似乎无法弄清楚。 This string is used to open a recordset that will populate a form. 此字符串用于打开将填充表单的记录集。

Private Sub BtnUseSelection_Click()

Dim CompSQL As String

CompSQL = "SELECT T1Company.LegalName, T2AddressType.AddressType, T1Addresses.City" & _
                    " FROM T2AddressType INNER JOIN (T1Addresses INNER JOIN (T1Company INNER JOIN T3Company_Addresses ON T1Company.CompanyID = T3Company_Addresses.CompanyID) ON T1Addresses.AddressID = T3Company_Addresses.AddressID)" & _
                    " ON T2AddressType.AddressTypeID = T1Addresses.AddressType" & _
                    " WHERE T1Company.LegalName = " & Me.LstboxCompanies.Column(0) & " And T2AddressType.AddressType = " & Me.LstboxCompanies.Column(1) & " And T1Addresses.City = " & Me.LstboxCompanies.Column(2)

Set db = CurrentDb

Set RSCompany = db.OpenRecordset(CompSQL, dbOpenSnapshot, dbSeeChanges)

Not quite sure what I am missing, any help would be greatly appreciated. 不太确定我缺少什么,将不胜感激。

Consider parameterizing query to avoid any need for quote enclosure or string concatenation. 考虑使用参数化查询来避免使用引号引起来或字符串串联。

SQL (save below as a saved Access query, more efficient than VBA string query as database engine saves best execution plan) SQL (以下保存为Access查询,比VBA字符串查询效率更高,因为数据库引擎保存了最佳执行计划)

PARAMETERS [LegalNameParam] Text(255), [AddressTypeParam] Text(255),
           [CityParam] Text(255);
SELECT T1Company.LegalName, T2AddressType.AddressType, T1Addresses.City
FROM T2AddressType
INNER JOIN (T1Addresses INNER JOIN (T1Company
            INNER JOIN T3Company_Addresses
             ON T1Company.CompanyID = T3Company_Addresses.CompanyID)
  ON T1Addresses.AddressID = T3Company_Addresses.AddressID)
  ON T2AddressType.AddressTypeID = T1Addresses.AddressType
WHERE T1Company.LegalName = [LegalNameParam]
 AND T2AddressType.AddressType = [AddressTypeParam]
 AND T1Addresses.City = [CityParam]

VBA (call the above query and bind values to named parameters) VBA (调用上面的查询并将值绑定到命名参数)

Dim db As Database, RSCompany As Recordset, qdef As QueryDef
Dim CompSQL As String

Set db = CurrentDb    
Set qdef = db.QueryDefs("myStoredQuery")

qdef!LegalNameParam = Me.LstboxCompanies.Column(0)
qdef!AddressTypeParam = Me.LstboxCompanies.Column(1)
qdef!CityParam = Me.LstboxCompanies.Column(2)

Set RSCompany = qdef.OpenRecordset(dbOpenSnapshot, dbSeeChanges)

It seems you've missed the ' ' around your string literals. 似乎您错过了字符串文字周围的“”。

instead of 代替

... WHERE T1Company.LegalName = " & Me.LstboxCompanies.Column(0) & " ...

use: 采用:

... WHERE T1Company.LegalName = '" & Me.LstboxCompanies.Column(0) & "' ...

You also need to escape your strings to avoid corruption of the command (or sql injections). 您还需要转义字符串,以避免损坏命令(或sql注入)。 Look here and here for some info. 在这里这里查看一些信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM