1

我刚刚了解了MS-ACCESS.

我有一个SQL SERVER后端,如果我是对的,查询访问会在执行 where 子句之前加载所有记录......那么拥有SQL SERVER后端有什么意义呢?

这就是为什么我想尽可能多地尝试使用直通查询,但是有没有办法可以从我的链接表中获取连接字符串以进行直通查询?

CurrentDb.TableDefs("One of my table name").Connect我在属性中尝试过,ODBC Connect Str但我收到错误消息,说它是无效的连接字符串。

这会很好,因为我知道我将不得不尽快更改连接,这样我就不必在很多地方编辑连接字符串。

谢谢你。

4

1 回答 1

2

我不确定你在这里的意思:“对于查询访问在执行 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。

于 2012-10-24T18:02:26.407 回答