Обновление связанной таблицы MS Access из файла VBS - PullRequest
0 голосов
/ 28 сентября 2011

В настоящее время я работаю над перемещением сотен баз данных доступа из различных папок в другой набор папок, и мне нужно обновить любые ссылки на связанные таблицы, которые будут повреждены во время перемещения.Я определил, как обновить местоположение таблицы связанной базы данных, добавив макрос в саму базу данных доступа, выполнив что-то вроде следующего:

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

Я надеюсь, что кто-то, более знакомый с этим типом кодирования, сможет указать мне правильное направление.Есть ли способ использовать таблицу TableDefs извне Access через VBS-файл и, если да, как будет выглядеть этот код.

Спасибо, Джереми

Ответы [ 3 ]

2 голосов
/ 28 сентября 2011

Вы не можете использовать tabledefs с 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 голос
/ 28 сентября 2011

Вам не нужно создавать экземпляр приложения 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")
1 голос
/ 28 сентября 2011

Мне удалось расширить ответ @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 за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...