Jak odświeżyć łącza w aplikacji czasu wykonywania w programie Microsoft Access


Streszczenie


W aplikacji w czasie wykonywania typu front-end i back-end bazy danych muszą być przechowywane w tym samym folderze. Mimo że można zmienić ścieżkę instalacji domyślnej bazy danych zaplecza, na przykład, $AppPath\Folder1, nie istnieje sposób dostępu do odświeżenia łączy w najbardziej wysuniętym punkcie odpowiadający nowej lokalizacji instalacji.

Jednym ze sposobów obejścia tego problemu jest programowo odświeżyć łącza za pomocą obiektów rozszerzalności ActiveX (ADOX) po zainstalowaniu aplikacji w czasie wykonywania. Poniżej przedstawiono ilustrację sposobu wdrożenia tej techniki. Należy pamiętać, że w tym artykule założono, że wewnętrznej bazy danych są przechowywane w podfolderach zewnętrzną bazę danych.

Więcej informacji


  1. Upewnij się, że masz najnowszą wersję z Microsoft Data Access Components (MDAC) zainstalowanych na komputerze. Składniki MDAC można znaleźć w następującej witrynie firmy Microsoft w sieci Web:
  2. Należy ustawić odwołanie Microsoft ADO Ext 2.5 (lub nowszego) dla DDL and Security.
  3. Utwórz nową bazę danych i nadaj mu nazwę FrontEnd.mdb.
  4. Importować formularze klientów i pracowników z przykładowej bazy danych Northwind.mdb do FrontEnd.mdb.
  5. Utwórz nową bazę danych i podfolder w folderze, gdzie FrontEnd.mdb znajduje się plik, na przykład Folder1\Backend1.mdb.
  6. Zaimportować tabeli Nabywca z Northwind.mdb do Backend1.mdb.
  7. Utwórz nową bazę danych i podfolder w folderze, gdzie FrontEnd.mdb znajduje się plik, na przykład Folder2\Backend2.mdb.
  8. Zaimportować tabeli pracowników z Northwind.mdb do Backend2.mdb.
  9. Otwórz bazę danych FrontEnd.mdb, a następnie utwórz nowy moduł. W module Wklej następujący kod:
    Option Compare DatabaseOption Explicit

    Private Declare Function apiSearchTreeForFile Lib "ImageHlp.dll" Alias _
    "SearchTreeForFile" (ByVal lpRoot As String, ByVal lpInPath _
    As String, ByVal lpOutPath As String) As Long


    Function RefreshLinks()
    On Error GoTo ErrorHandler


    Dim objCat As New ADOX.Catalog 'Define the ADOX Catalog Object
    Dim objTbl As ADOX.Table 'Define the ADOX Table Object

    Dim strSearchFolder As String 'Folder to Search in.
    Dim strFilename As String 'Db Name of the Linked Table
    Dim strFullName As String 'Path & DB Name of the Linked Table.
    Dim strSearchFile As String 'The new path of the database.

    Dim blnTablesNotLinked As Boolean 'Determines if links are valid

    'Open the catalog
    objCat.ActiveConnection = CurrentProject.Connection

    'Loop through the table collection and refresh the linked tables.
    For Each objTbl In objCat.Tables

    ' Check to make sure the table is a linked table.
    If objTbl.Type = "LINK" Then
    strFullName = objTbl.Properties("Jet OLEDB:Link Datasource")
    strFilename = Mid(strFullName, InStrRev(strFullName, "\", _
    Len(strFullName)) + 1, Len(strFullName))
    strSearchFolder = CurrentProject.Path
    'The following line of code attempts to refresh the link.
    'If the source cannot be found an error is generated.
    'Please note that this code only checks one table to determine
    'whether or not the links are valid.
    objTbl.Properties("Jet OLEDB:Link Datasource") = strFullName

    If blnTablesNotLinked = False Then
    Exit Function
    Else
    'Set the search path to the path of the current project.
    'The assumption is that the linked tables are located in subfolders.
    strSearchFile = SearchFile(strFilename, strSearchFolder)
    objTbl.Properties("Jet OLEDB:Link Datasource") = strSearchFile
    End If
    End If
    Next

    MsgBox "The links were successfully refreshed!!! "

    ExitHandler:
    Exit Function

    ErrorHandler:
    Select Case Err.Number
    Case -2147467259
    blnTablesNotLinked = True
    Resume Next
    Case Else
    MsgBox Err.Description & " " & Err.Number
    Resume ExitHandler
    End Select
    End Function

    Function SearchFile(ByVal strFilename As String, _
    ByVal strSearchPath As String) As String
    'Search the folder for first occurrence of the source databases.
    Dim strBuffer As String
    Dim lngResult As Long
    SearchFile = ""
    strBuffer = String$(1024, 0)
    lngResult = apiSearchTreeForFile(strSearchPath, strFilename, strBuffer)
    If lngResult <> 0 Then
    If InStr(strBuffer, vbNullChar) > 0 Then
    SearchFile = Left$(strBuffer, InStr(strBuffer, vbNullChar) - 1)
    End If
    End If
    End Function

    Ta funkcja sprawdza, czy pierwszy tabeli połączonej w bazie danych, aby określić, czy łącza są prawidłowe. Jeśli łącza nie są prawidłowe, funkcja wyszukiwania dla bazy danych i odświeża łącza.
  10. Utwórz nowe makro z następującymi właściwościami i nadaj mu nazwę AutoExec:
       Action: RunCode
    Function Name: RefreshLinks()

    Action: OpenForm
    Form Name: Customers

    Action: OpenForm
    Form Name: Employees

    Uwaga: można również wywołać tę funkcję w zdarzeniu Open ukryty formularz startowy.
  11. Tworzenie pakietu aplikacji w czasie wykonywania. Pamiętaj, aby dodać "Folder1" i "Folder2" do lokalizacji danej instalacji.

    W programie Access 2007 i Access 2003 Dodawanie plików zaplecza w sekcji "Dodatkowe pliki", a następnie podaj nazwy odpowiedniego folderu "Folder1" i "Folder2" w kolumnie Podfolder instalacji .

    Access 2002 i Access 2000 "\Folder1\$ (AppPath)" i "\Folder2\$ (AppPath)" należy dodać do lokalizacji odpowiednich instalacji na stronie Lokalizacja instalacji.

  12. Wdrażanie aplikacji w czasie wykonywania.
Podczas uruchamiania aplikacji, klepsydry wskazuje, że łącza są odświeżane. Następnie otworzy formularze klientów i pracowników z prawidłowymi danymi.

Powiązane artykuły


Aby uzyskać więcej informacji o tym, jak odświeżyć tabele połączone, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:

209862 jak łączenie tabel zaplecza z wspólną kontrolą okno dialogowe w programie Access 2000