我正在尝试在访问前端实现后期绑定,但无法让 DAO 参考工作

Posted

技术标签:

【中文标题】我正在尝试在访问前端实现后期绑定,但无法让 DAO 参考工作【英文标题】:I'm trying to implement late binding on an access front end and can not get a DAO refrence to work 【发布时间】:2021-11-13 10:53:11 【问题描述】:

我正在做一个数据库后期绑定,这样当前端打开时,使用不同版本的 MS Office 的用户不会有问题。我在这段代码中不断收到运行时错误 438(对象不支持此属性或方法),与 For Each tdf In dbs.TableDefs 一致。

我看不出这里出了什么问题。一切都被宣布,它应该找到它。有人能指出可能发生的事情吗?

Function RelinkTables()
On Error GoTo EndFast
'Routine to relink the tables automatically. Change the constant LnkDataBase to the desired one and run the sub
'DB front end could be used in 2 or more locations with different backends.

Dim dbs As Object
#If VBA7 Then
    Set dbs = CreateObject("DAO.DBEngine.120")
#Else
    Set dbs = CreateObject("DAO.DBEngine.36")
#End If
'    Dim dbs As DAO.Database
'    Set dbs = CurrentDb
Dim tdf As Object
'Dim tdf As DAO.TableDef
Dim strTable As String
Dim strLocation As String

'Abandon relinking if file is development version
If VBA.InStr(1, VBA.UCase(GetNamePath), "_DEV") > 0 Then Exit Function

'Get the Path of the Document and form backend name
strLocation = GetFolderFromPath(GetNamePath)
strLocation = FormBackendName(strLocation)

'Go about relinking
For Each tdf In dbs.TableDefs
    If VBA.Len(tdf.Connect) > 1 Then 'Only relink linked tables
       'If tdf.Connect <> ";DATABASE=" & LnkDataBaseDubai Then 'only relink tables if the are not linked right '' With PW, Access wont relink, even when the PW is Correct. MUST RELINK!
            If VBA.Left(tdf.Connect, 4) <> "ODBC" Then 'Don't want to relink any ODBC tables
                strTable = tdf.Name
                'dbs.TableDefs(strTable).Connect = ";DATABASE=" & strLocation & ";PWD=" & DatenbankPW 'With password
                dbs.TableDefs(strTable).Connect = ";DATABASE=" & strLocation & ";" 'Without password
                dbs.TableDefs(strTable).RefreshLink
            End If
        'End If
    End If
Next tdf

dbs.Close
    Exit Function
    
EndFast:
On Error GoTo 0
    MsgBox "The backend database was not found. Without the backend this database does not work." & vbCrLf _
        & "" & vbCrLf _
        & "Ensure that an Access Backend DB is located in the a subfolder called: ""_Sources"" and that read and write permission for the folder are granted." & vbCrLf _
        & "" & vbCrLf _
        & "Contact the developer if further support is needed.", vbOKOnly Or vbExclamation Or vbSystemModal Or vbMsgBoxSetForeground, "Database backend not found"

End Function

【问题讨论】:

【参考方案1】:

如果你想使用表,你需要实际打开一个数据库。

您已将dbs 设置为数据库引擎,而不是数据库。

如果您希望它成为当前数据库,只需将其设置为这样,无需提前绑定:

Dim dbs As Object
Set dbs = CurrentDb

否则,打开一个数据库:

Dim dbs As Object
Dim dbe As Object
#If VBA7 Then
    Set dbe = CreateObject("DAO.DBEngine.120")
#Else
    Set dbe = CreateObject("DAO.DBEngine.36")
#End If
Set dbs = dbe.OpenDatabase("C:\Some database.mdb") 
' Must be mdb since DAO.DBEngine.36 doesn't support accdb

【讨论】:

【参考方案2】:

Access 不再需要对 DAO 库的引用(自 Access 2007 起,DAO 库已内置)。所以删除 dao 引用。您不需要它,后期绑定不会帮助也不会改变损坏的参考问题。

所以,你会注意到现在的引用是这样的:

您无法删除 ACE 数据引擎引用,但您确实希望确保不引用 DAO 对象库。

如果您使用的是 2007 年之前的数据库,并且您还没有使用 ACE,并且使用的是 mdb 文件,则您只能引用 DAO。

对于 accDB,并从 2007 年开始访问?

Access 团队现在拥有 Access 的 DAO,他们现在不更新或维护外部 DAO 库。不要引用 DAO 库。

因此,DAO 现在内置于 Access 中。 (但是是的,您现在必须引用 ACE 数据引擎)

但是,即使有上述引用,您也可以并且应该养成在代码中引用 DAO 的习惯,因为这不仅是一个好习惯,而且还给您带来了英特尔感知作为奖励。

在您的代码模块中显示一个选项是个好主意。

所以,不需要后期绑定 DAO,因为你不再需要对 DAO 的引用了!!

【讨论】:

我确实始终如一地引用 DAO 并在我所做的一切中使用 Option Explicit。感谢权威信息! 如前所述,从 2007 年起,您不再需要也不需要 DAO 引用 - 它现在是 ACE 引擎的一部分。如果您有 DAO 引用,请将其删除 - 不再需要它。即使删除了 DAO 引用,您也可以使用 DAO 对象 - 它们现在是 Access 产品的一部分。

以上是关于我正在尝试在访问前端实现后期绑定,但无法让 DAO 参考工作的主要内容,如果未能解决你的问题,请参考以下文章

通过 VBA 发送具有后期绑定错误的电子邮件

从 Access 中打开 Outlook 的后期绑定

Dao层Dao层实现类和Service层Service实现类的关系

子 AppDomain (.Net) 中的后期绑定

WeChair项目Alpha冲刺(5/10)

Vue JS CSS 样式绑定