从VBS文件更新MS Access链接表

时间:2011-09-27 21:08:24

标签: ms-access vbscript

我目前正在努力将100多个访问数据库从各种文件夹移动到另一组文件夹,并且需要更新对移动期间将被破坏的链接表的任何引用。我已经确定了如何通过执行类似以下操作的方式向访问数据库本身添加宏来更新链接数据库表的位置:

Dim tdf As TableDef, db As Database
Set db = CurrentDb
db.TableDefs.Refresh
For Each tdf In db.TableDefs
    ' My Logic for checking to see if it is is a linked 
    ' table and then updating it appropriately
Next
Set collTables = Nothing
Set tdf = Nothing
Set db = Nothing

但是,我不想将代码添加到每个访问数据库中,所以我想知道是否有办法创建一个可以执行相同类型逻辑的VBS文件。我尝试了以下代码,但是当执行每个逻辑的行时,我收到以下错误:“参数类型错误,超出可接受的范围或彼此冲突”

Set MyConn = CreateObject("ADODB.Connection")
MyConn.Open "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = MyFile.mdb"

for each tblLoop in db.TableDefs
    ' business logic
next

set tblLoop = nothing
MyConn.close
set MyConn = nothing

我希望更熟悉这种编码的人能够指出我正确的方向。有没有办法通过VBS文件从Access外部利用TableDefs表,如果有的话,该代码会是什么样的。

谢谢, 杰里米

3 个答案:

答案 0 :(得分:2)

您不能将tabledef与ADO一起使用,但可以在VBScript中打开数据库:

Dim db ''As DAO.Database 
Dim ac ''As Access Application

''As noted by wmajors81, OpenDatabase is not a method of the application object
''OpenDatabase works with DBEngine: http://support.microsoft.com/kb/152400
Set ac = CreateObject("Access.Application")
ac.OpenCurrentDatabase("c:\test.mdb") 
Set db = ac.CurrentDatabase

For Each tdf In db.TableDefs

如果您启动了代码或表单或数据库密码,您将遇到一些问题,但这些问题可以通过模拟shift键按下来解决。我认为,这在VBA中比VBScript更容易,但AFAIK在VBScript中是可能的。可以在OpenDatabase操作中提供数据库密码。

答案 1 :(得分:1)

我能够扩展@Remou的答案来提出一些有用的代码。他的部分答案包括以下声明,该错误引发了错误“Set db = ac.OpenDatabase”。据我所知,“OpenDatabase”不是一个有效的方法,而是OPenCurrentDatabase。此外,我在尝试将db设置为等于OpenCurrentDatabase返回的值时收到错误,所以我假设它是一个sub而不是一个函数。但是,一旦我使用OpenCurrentDatabase建立了与数据库的连接,我就可以利用ac.CurrentDB访问当前数据库

Dim db ''As DAO.Database 
Dim ac ''As Access Application

Set ac = CreateObject("Access.Application")
ac.OpenCurrentDatabase("D:\delete\UpdatingLinkedTableInAccess\GrpLfRsvs201108.mdb")

set db = ac.CurrentDB

For Each tdf In db.TableDefs
        With tdf
            If Len(.Connect) > 0 Then
                If Left(.Connect, 4) = "ODBC" Then
                ' ignore these are connected via ODBC and are out of scope
                Else
                        ' biz logic
                End If
            End If
        End With
next

set db = nothing
ac.Quit
set ac = nothing

再次感谢@Remou的帮助。

答案 2 :(得分:1)

您无需创建Access应用程序实例。请改用DBEngine和DAO.Workspace。

Option Explicit
Dim db
Dim dbe
Dim strDbPath
Dim tdf
Dim wrkJet

strDbPath = "C:\Access\webforums\whiteboard2003.mdb"

Set dbe = CreateObject("DAO.DBEngine.36")
Set wrkJet = dbe.CreateWorkspace("", "admin", "", 2) ' dbUseJet = 2
' exclusive = True and read-only = False '
Set db = wrkJet.OpenDatabase(strDbPath, True, False)

For Each tdf In db.TableDefs
    If Left(tdf.Connect, 10) = ";DATABASE=" Then
        WScript.Echo tdf.Connect
    End If
Next
db.Close
Set db = Nothing
Set wrkJet = Nothing
Set dbe = Nothing

对于ACCDB格式数据库,您需要“DAO.DBEngine.120”。

如果您使用的是数据库密码,请将其包含在OpenDatabase中。

Set db = wrkJet.OpenDatabase(strDbPath, True, False, ";pwd=password")