【问题标题】:Converting DAO to ADO将 DAO 转换为 ADO
【发布时间】:2025-12-28 02:30:12
【问题描述】:

我正在使用具有使用 DAO 代码的子例程的 Access 2003 数据库。此代码循环遍历表定义并刷新 ODBC 连接字符串。我想将其转换为 ADO,因此我不必引用 DAO 对象库。这是代码...

Public Sub RefreshODBCLinks(newConnectionString As String)

    Dim db As DAO.Database
    Dim tb As DAO.TableDef
    Set db = CurrentDb
    For Each tb In db.TableDefs
        If Left(tb.Connect, 4) = "ODBC" Then
            tb.Connect = newConnectionString
            tb.RefreshLink
            Debug.Print "Refreshed ODBC table " & tb.Name
        End If
    Next tb
    Set db = Nothing

    MsgBox "New connection string is " & newConnectionString, vbOKOnly, "ODBC Links refreshed"

End Sub

我不确定的部分是如何遍历表并获取/设置它们的连接字符串。

【问题讨论】:

  • 链接表是一个 Jet 对象,因此,DAO 是用于更改它的正确接口。

标签: ms-access ado vba dao


【解决方案1】:

DAO 确实是最好的选择,您不能使用 ADO 刷新链接,而是需要使用 ADOX(一些相关代码 here)。

您可以通过Jet OLEDB:Link Provider String访问连接字符串

【讨论】:

  • 感谢您的信息。 ADOX 功能是否已包含在 ADO 库中?如果不是,我必须引用另一个库,我还不如继续使用 DAO 代码。
  • 这是对 msadox.dll 的另一个引用,对我来说它自称为“Microsoft ADO Ext.dll”。 2.7 用于 DDL 和安全性'
  • 谢谢亚历克斯。在您看来,是坚持使用 DAO 代码并引用 DAO 库更好,还是引用 ADOX 库并使用 ADOX 代码更好?
  • DAO 是首选,因为链接表是 Jet/ACE 对象。
【解决方案2】:

如果避免对 DAO 的引用是您的目标,您只需修改现有过程以对 DAO 使用后期绑定。例如,这个 sub 应该在没有 DAO 参考集的情况下工作。

Public Sub DAO_without_reference()
    Dim db As Object
    Dim td As Object
    Set db = CurrentDb
    For Each td In db.TableDefs
        Debug.Print td.Name
    Next td
    Set db = Nothing
End Sub

在编写代码时,您不会有 Intellisense 来帮助您处理 DAO 属性、方法和常量,但代码仍然可以使用后期绑定。

如果您决心避免引用 DAO,我认为这将是您最简单的选择。但是,我从来没有开发过没有 DAO 引用的 Access 项目,我不明白你为什么反对添加它。

编辑:此外,如果您使用后期绑定和任何 DAO 常量,您的代码必须使用常量值而不是名称。

【讨论】:

  • 感谢 HansUp。我没有决心避免 DAO。相反,如果我能提供帮助,我只想避免添加额外的引用。依赖越少越好。至于DAO,只是我比较熟悉ADO库和对象模型。话虽如此,很多人都建议 DAO 是要走的路。关于在哪里可以找到使用中的 DAO 的文档和示例的任何建议?我几乎所有关于 Access 2003 的书籍似乎都只讨论 ADO。
  • @webworm 我也尝试限制引用的数量,但 DAO 是我始终包含的一个。 DAO 似乎更适合 Jet/ACE 数据源。您可以在 The Access Cookbook(来自 O'Reilly)中找到 DAO 代码示例。实际上,当我第一次开始使用 Access 时,我选择专注于 ADO,但对我遇到的大多数代码示例都是 DAO 感到失望。你似乎处于相反的境地。试试mvps.org/accessallenbrowne.com/tips.html
  • 感谢 HansUp .. 很好的反馈!最后一个问题。鉴于我的数据存储是 SQL Server,并且我从代码中访问所有存储过程,你还会使用 DAO 而不是 ADO 吗?非常感谢。
  • 好问题。这就是我使用 ADO 的情况。 (当然,SQL Server 不是 Jet/ACE 数据源。)另外,ADO 用于 DDL 语句,因为 ADO 支持比 DAO 更多的 DDL 功能。以及我不经常使用的其他功能(断开连接的记录集)的 ADO。总的来说,可能超过 90% 的 Access VBA 代码使用 DAO,
  • 如果您正在使用链接表来访问您的数据,那么 DAO 是您应该使用的引用,它是您应该与后期绑定一起使用的 ADO。 ADO 应该很少使用,因为 Jet/ODBC 不能做好的事情。