我不确定你在这里的意思:“对于查询访问在执行 where 子句之前加载所有记录”
如果该WHERE
子句可以在服务器上应用,则 ODBC 会将其翻译为服务器的语言,并且只有匹配的行将被发送回 Access:
WHERE date_field >= #2011-01-01# AND date_field < #2012-01-01#
该WHERE
子句会将发送到 Access 的行限制为仅那些date_field
值来自 2011 年的行。
但是,如果WHERE
子句包含必须由 Access 评估的函数,则 ODBC 必须检索所有候选行并将它们交给 Access db 引擎,以便它可以执行评估。
WHERE Format(date_field, 'yyyy') = '2011'
但是对于您的实际问题......通过查询的连接字符串......请考虑以下代码示例。我有一个名为 ODBC 链接dbo_foo
,其在 SQL Server 中的源表是[dbo].[foo]
. 因此,我可以从中获取.Connect
属性dbo_foo
并将其用于.Connect
基于同一服务器表的传递查询的属性。
Public Sub CreatePassThruQuery()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strConnect As String
Set db = CurrentDb
strConnect = db.TableDefs("dbo_foo").Connect
Set qdf = db.CreateQueryDef("qryDbo_Foo")
qdf.Connect = strConnect
qdf.SQL = "SELECT * FROM [dbo].[foo];"
qdf.Close
Set qdf = Nothing
Set db = Nothing
End Sub
尽管如此,当您更改.Connect
表的属性时,您还需要为查询执行此操作。如果你有很多和/或经常更改连接,那么创建一个 VBA 过程来更新它们可能是值得的。或者,您可以将 DSN 用于.Connect
表和匹配查询的属性。然后根据需要修改 DSN。这种方法的一个缺陷是,如果其他人将使用您的应用程序,您将需要在多台机器上管理 DSN。