2011-09-27 80 views
0

我目前正致力于将100多种访问数据库从各种文件夹移动到另一组文件夹,并且需要更新对移动过程中将断开的链接表的任何引用。我已经确定了如何通过增加一个宏来访问数据库本身做类似下面的更新链接数据库表的位置:从VBS文件更新MS Access链接表

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表,如果是这样,那么代码将如何。

感谢, 杰里米

+0

您是否考虑过使用仅由VBA模块组成的新数据库作为简单的一次性应用程序,而不是使用VBS文件?换句话说,创建一个新的数据库,添加一个VBA模块,并编写代码来打开每个MDB文件并执行您的逻辑,或者,如果可能的话,建立一个ADODB连接而不是打开每个文件? – Banjoe

+0

@Banjoe我确实想到完全按照你所描述的方式去做,但只是想先评估所有的选项。我需要做的一件事就是查看目录中的所有文件并动态更新链接表的位置。我认为利用VBS而不是VBA会更容易,但我还没有证明这一点。感谢您的回应。 – jwmajors81

回答

2

你不能用ADO使用tabledefs,但你可以打开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 

等等

如果你有启动代码或形式,或数据库密码,你会遇到一些问题,但通过模拟键盘按键,大多数情况下都可以克服这些问题。我认为在VBA中这比VBScript更容易,但AFAIK可以在VBScript中使用。数据库密码可以在OpenDatabase操作中提供。

1

我能够扩展@Remou的答案来提出一些有效的代码。他的答案的一部分包括下面的语句抛出一个错误“Set db = ac.OpenDatabase”。据我可以告诉“OpenDatabase”不是一个有效的方法,但OPenCurrentDatabase是。另外,当我试图设置db等于OpenCurrentDatabase返回的值时,我得到一个错误,所以我假设它是一个子而不是函数。但是,我能够利用ac.CurrentDB以访问当前数据库一旦我再次确立使用OpenCurrentDatabase方法

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的协助连接到数据库。

+0

你是对的,Opendatabase是DAO.Workspace和DBEngine的一种方法,而不是应用程序。如果您使用密码,您可能需要这些。 – Fionnuala

+0

这是DBEngine的参考:http://support.microsoft.com/kb/152400 – Fionnuala

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") 
+0

感谢您的信息。使用DBEngine与访问应用程序实例有什么好处? – jwmajors81

+0

我的猜测是为每个MDB启动一个Access应用程序实例可能需要更多的资源。我没有做任何比较测试,所以不能提供对影响的猜测。可能不明显,甚至不可衡量。您可以通过重新使用单个应用程序实例来打开一系列数据库文件来对其进行编码。但我想到“为什么打扰?”您不需要Access应用程序实例即可使用DBEngine和Workspace对象;你可以直接使用它们。 – HansUp