2011-09-27 78 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