我正在尝试在访问前端实现后期绑定,但无法使 DAO 引用正常工作
I'm trying to implement late binding on an access front end and can not get a DAO refrence to work
我正在做一个数据库后期绑定,这样当前端打开时,使用不同版本的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
如果要使用表,您需要实际打开一个数据库。
您已将 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
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 的引用!!
我正在做一个数据库后期绑定,这样当前端打开时,使用不同版本的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
如果要使用表,您需要实际打开一个数据库。
您已将 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
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 的引用!!