如何重新連結具有通用對話方塊控制項在 Access 2000 的後端資料表

文章翻譯 文章翻譯
文章編號: 209862 - 檢視此文章適用的產品。
本文章的有 Microsoft Access 97] 版本請參閱 181076
進階: 須具備專家編碼、 互通性,與多使用者技能。

本文只適用於 Microsoft Access 資料庫 (.mdb)。

全部展開 | 全部摺疊

在此頁中

結論

本文將告訴您如何使用 通用型對話方塊 」 控制項來重新整理資料庫中的連結的資料表。通用型對話方塊 」 控制項,就 Microsoft Office 2000 開發 o 人 h 員 ? 工 u 具 ? 版]。被連結的資料表可能位於一或多個後端資料庫。

請使用 Microsoft Windows 應用程式設計介面 (API) 函數的重新連結資料表的不同方法的範例參照開發 o 人 h 員 ? 工 u 具 ? 方案範例程式 (Solutions9.mdb)。若要取得 Solutions9.mdb,按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
248674ACC2000: 訂貨主檔] 和 [開發 o 人 h 員 ? 工 u 具 ? 方案範例資料庫可用 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN)
開啟 Solutions9.mdb 資料庫、 選取 [選取範例的類別] 方塊中中的 [使用多個資料庫,然後按一下 [選取範例] 方塊中的 連結資料表,在啟動時

其他相關資訊

Microsoft 僅,為了說明提供程式設計範例,不提供任何明示或默示的保證。這包括,但不限於適售性或適合某特定用途之默示擔保責任。本文假設您已熟悉使用我們所示範的程式設計語言以及建立和偵錯程序所使用的工具。Microsoft 技術支援工程師可以協助解釋特定程序的功能,但它們不會修改這些範例以提供附加功能或建構程序,以符合您特定需求。使用分割資料庫設計一個程式都有其資料表在共用的網路位置 (後端資料庫),一個資料庫和所有的查詢、 表單、 報表、 巨集和每一部用戶端電腦 (前端資料庫) 上的另一個資料庫中的模組中。前端資料庫連結所有其資料表後端資料庫。如果移動後端資料庫會在您的程式中發生錯誤。您可以啟用您的程式,以偵測後端資料庫檔案是遺漏,來自預期的位置並再提示使用者輸入新的位置。

下列範例會示範如何重新連結資料表的資料,在您的程式中。這個方法會使用的表單,使用者可以開啟要重新連結後端的資料表可以在開啟資料庫時自動確認後端連結的另一個選擇性表單。

本文假設您有使用 Microsoft Office 2000 開發 o 人 h 員 ? 工 u 具 ? 版] 與 [Microsoft 通用型對話方塊 」 控制項。如果您沒有此控制項略過 Browse() 函式,在範例]。

注意: 如果您使用 通用型對話方塊 控制項,並且您計劃散發資料庫程式您必須使用封裝暨部署精靈 」 來包含通用對話方塊控制檔案、 Comdlg32.ocx 和其支援的 DLL 與安裝程式檔案。使用 [封裝暨部署精靈 」 的相關資訊,請參閱本文 < 參考 > 一節中列出文件。

若要重新連結後端資料庫資料表的方法

警告: 如果您依照本範例,修改範例資料庫 Northwind.mdb。您可能要備份 Northwind.mdb 檔案和資料庫的副本上依照下列步驟執行。

  1. 建立新的空白 Access 資料庫檔案,並命名 FrontEnd.mdb
  2. 在 [檔案] 功能表上指向 [取得外部資料],然後按一下 [連線資料表]。
  3. 瀏覽至選取範例資料庫 Northwind.mdb,並再按 [連結]。在 [連線資料表] 對話方塊按一下 [全選],再按 [確定]
  4. 建立下列的新表單,不根據任何資料表或在 [設計] 檢視中的查詢:
    表單: frmNewDataFile

    文字] 方塊中:
    名稱: txtFileName
    寬度: 3"
    通用對話方塊控制項:
    名稱: xDialog
    指令按鈕:
    名稱: cmdBrowse
    標題: 瀏覽...
    在按: =browse()
    指令按鈕:
    名稱: cmdLinkNew
    標題: 重新整理連結
    在 [按一下: =Processtables()
    指令按鈕:
    名稱: cmdCancel
    標題: 按 [取消]
    OnClick: [事件程序]
    取消: [是]
  5. 按一下 [檢視] 功能表 程式碼
  6. 輸入或貼上下列程序:
    Private Sub cmdCancel_Click()
       On Error GoTo Err_cmdCancel_Click
     
       MsgBox "Link to new back-end cancelled", vbExclamation, "Cancel Refresh Link"
       DoCmd.Close acForm, Me.Name
    
    Exit_cmdCancel_Click:
       Exit Sub
    
    Err_cmdCancel_Click:
       MsgBox Err.Description
       Resume Exit_cmdCancel_Click
    
    End Sub
    					
  7. 偵錯] 功能表上按一下 [編譯 FrontEnd]。
  8. 儲存 frmNewDataFile 表單並關閉它。
  9. 在 [資料庫] 視窗中按一下 [模組,然後按一下 [新增]
  10. 在 [工具] 功能表上按一下 [設定 引用項目],選取 Microsoft DAO 3.6 物件程式庫,如果它不被選取,然後再按一下 [確定]
  11. 輸入或貼上下列程式碼:
    Dim UnProcessed As New Collection
           
    Public Function Browse()
        ' Prompts user for back-end database file name.
        On Error GoTo Err_Browse
        
        Dim strFilename As String
        Dim oDialog As Object
        Set oDialog = [Forms]![frmNewDatafile]!xDialog.Object
        
        With oDialog                    ' Ask for new file location.
            .DialogTitle = "Please Select New Data File"
            .Filter = "Access Database(*.mdb;*.mda;*.mde;*.mdw)|" & _
            "*.mdb; *.mda; *.mde; *.mdw|All(*.*)|*.*"
            .FilterIndex = 1
            .ShowOpen
            If Len(.FileName) > 0 Then  ' user responded, put selection into text box on form.
               [Forms]![frmNewDatafile]![txtFileName] = .FileName
            End If
        End With
    
    Exit_Browse:
        Exit Function
    
    Err_Browse:
        MsgBox Err.Description
        Resume Exit_Browse
    
    End Function
    
    Public Sub AppendTables()
    
        Dim db As DAO.Database, x As Variant
        Dim strTest As String
        ' Add names of all table with invalid links to the Unprocessed Collection.
        Set db = CurrentDb
        ClearAll
        For Each x In db.TableDefs
            If Len(x.Connect) > 1 And Len(Dir(Mid(x.Connect, 11))) = 0 Then
            ' connect string exists, but file does not
                 UnProcessed.Add Item:=x.Name, Key:=x.Name
            End If
        Next
    
    End Sub
    
    Public Function ProcessTables()
    
        Dim strTest As String
        On Error GoTo Err_BeginLink
        
        ' Call procedure to add all tables with broken links into a collection.
        AppendTables
        
        ' Test for existence of file name\directory selected in Common Dialog Control.
        strTest = Dir([Forms]![frmNewDatafile]![txtFileName])
        
        On Error GoTo Err_BeginLink
        If Len(strTest) = 0 Then   ' File not found.
            MsgBox "File not found. Please try again.", vbExclamation, "Link to new data file"
            Exit Function
        End If
        
        ' Begin relinking tables.
        Relinktables (strTest)
        ' Check to see if all tables have been relinked.
        CheckifComplete
        
        DoCmd.Echo True, "Done"
        If UnProcessed.Count < 1 Then
             MsgBox "Linking to new back-end data file was successful."
        Else
             MsgBox "Not All back-end tables were successfully relinked."
        End If
        DoCmd.Close acForm, [Forms]![frmNewDatafile].Name
        
    Exit_BeginLink:
        DoCmd.Echo True
        Exit Function
        
    Err_BeginLink:
        Debug.Print Err.Number
        If Err.Number = 457 Then
            ClearAll
            Resume Next
        End If
        MsgBox Err.Number & ": " & Err.Description
        Resume Exit_BeginLink
    
    End Function
    
    Public Sub ClearAll()
        Dim x
        ' Clear any and all names from the Unprocessed Collection.
        For Each x In UnProcessed
           UnProcessed.Remove (x)
        Next
    End Sub
    
    Public Function Relinktables(strFilename As String)
    
        Dim dbbackend As DAO.Database, dblocal As DAO.Database, ws As Workspace, x, y
        Dim tdlocal As DAO.TableDef
        
        On Error GoTo Err_Relink
        
        Set dbbackend = DBEngine(0).OpenDatabase(strFilename)
        Set dblocal = CurrentDb
        
        ' If the local linked table name is found in the back-end database
        ' we're looking at, Recreate & Refresh its connect string, and then
        ' remove its name from the Unprocessed collection.
         For Each x In UnProcessed
            If Len(dblocal.TableDefs(x).Connect) > 0 Then
                For Each y In dbbackend.TableDefs
                    If y.Name = x Then
                        Set tdlocal = dblocal.TableDefs(x)
                        tdlocal.Connect = ";DATABASE=" & _
                        Trim([Forms]![frmNewDatafile]![txtFileName])
                        tdlocal.RefreshLink
                        UnProcessed.Remove (x)
                    End If
                Next
            End If
        Next
    
    Exit_Relink:
        Exit Function
    
    Err_Relink:
        MsgBox Err.Number & ": " & Err.Description
        Resume Exit_Relink
    
    End Function
    
    Public Sub CheckifComplete()
    
        Dim strTest As String, y As String, notfound As String, x
        On Error GoTo Err_BeginLink
        
        ' If there are any names left in the unprocessed collection,
        ' then continue.
        If UnProcessed.Count > 0 Then
            For Each x In UnProcessed
                notfound = notfound & x & Chr(13)
            Next
            ' List the tables that have not yet been relinked.
            y = MsgBox("The following tables were not found in " & _
            Chr(13) & Chr(13) & [Forms]![frmNewDatafile]!txtFileName _
            & ":" & Chr(13) & Chr(13) & notfound & Chr(13) & _
            "Select another database that contains the additional tables?", _
            vbQuestion + vbYesNo, "Tables not found")
            
            If y = vbNo Then
                Exit Sub
            End If
            
            ' Bring the Common Dialog Control back up.
            Browse
            strTest = Dir([Forms]![frmNewDatafile]![txtFileName])
            If Len(strTest) = 0 Then   ' File not found.
                MsgBox "File not found. Please try again.", vbExclamation, _
                "Link to new data file"
                Exit Sub
           End If
           Debug.Print "Break"
           Relinktables (strTest)
        Else
           Exit Sub
        End If
        
        CheckifComplete
        
    Exit_BeginLink:
        DoCmd.Echo True   ' Just in case of error jump.
        DoCmd.Hourglass False
        Exit Sub
    
    Err_BeginLink:
        Debug.Print Err.Number
        If Err.Number = 457 Then
            ClearAll
            Resume Next
        End If
        MsgBox Err.Number & ": " & Err.Description
        Resume Exit_BeginLink
    
    End Sub
    					
  12. 偵錯] 功能表上按一下 [編譯 FrontEnd]。
  13. 將模組儲存為 RelinkCode,然後再關閉它。
  14. 重新命名 Northwind.mdb 範例資料庫或移至另一個資料夾您硬碟上以便 FrontEnd.mdb 中連結的資料表將需要重新整理。
  15. 開啟 frmNewDataFile] 表單,然後按一下 [瀏覽] 按鈕。
  16. 在 [請選取新資料檔案] 對話方塊在新的資料夾中找出 Northwind.mdb,然後按一下 [開啟舊檔]。

    請注意資料庫的路徑和檔案的名稱出現在表單上的 [文字] 方塊中。
  17. 按一下表單上的 [重新整理連結] 按鈕。

    請注意程序完成時收到下列訊息:
    將連結到新的後端資料檔案已成功。

建立啟動表單,來檢查連結的資料表

若要確認連結到後端資料表自動每次您開啟 FrontEnd.mdb 資料庫,您可以建立為該目的隱藏的表單請依照下列步驟執行:
  1. 建立新的表單不根據任何表格或查詢設計] 檢視。
  2. 按一下 [檢視] 功能表 程式碼
  3. 輸入將表單開啟時若要執行下列程序:
    Private Sub Form_Open(Cancel As Integer)
          ' Tests a linked table for valid back-end.
          On Error GoTo Err_Form_Open
          Dim strTest As String, db As DAO.Database
          Dim td As DAO.TableDef
          Set db = CurrentDb
          For Each td In db.TableDefs
             If Len(td.Connect) > 0 Then   ' Is a linked table.
                On Error Resume Next   ' Turn off error trap.
                strTest = Dir(Mid(td.Connect, 11))   ' Check file name.
                On Error GoTo Err_Form_Open   ' Turn on error trap.
                If Len(strTest) = 0 Then   ' No matching file.
                   If MsgBox("Couldn't find the back-end file " & _
                      Mid(td.Connect, 11) & ". Please choose new data file.", _
                      vbExclamation + vbOKCancel + vbDefaultButton1, _
                      "Can't find backend data file.") = vbOK Then
                         DoCmd.OpenForm "frmNewDataFile"   ' Open prompt form.
                         DoCmd.Close acForm, Me.Name
                         Exit Sub                          ' to refresh links
                   Else
                      MsgBox "The linked tables can't find their source. " & _
                      "Please log onto network and restart the application."
                   End If
                End If
             End If
          Next   ' Loop to next tabledef.
          DoCmd.Close acForm, Me.Name
    Exit_Form_Open:
          Exit Sub
    Err_Form_Open:
          MsgBox Err.Number & ": " & Error.Description
          Resume Exit_Form_Open
          End Sub
    					
  4. 偵錯] 功能表上按一下 [編譯 FrontEnd]。
  5. 將表單儲存為 frmCheckLink,然後再關閉它。
  6. 若要將 frmCheckLink 設為 工具] 上的啟動表單功能表按一下 [啟動]、 請 顯示表單/畫面] 清單中選取 frmCheckLink,然後按一下 [確定] 新檔]。
  7. 若要讓 frmCheckLink 隱藏的表單,frmCheckLink 在 [資料庫] 視窗上按一下滑鼠右鍵,並按一下 [內容快顯功能表上,按一下以選取 [frmCheckLink 內容] 對話方塊中的 [隱藏] 核取方塊然後按一下 [確定]
  8. 移 Northwind.mdb 範例資料庫中另一個資料夾您硬碟上,以便 FrontEnd.mdb 中連結的資料表將需要重新整理。
  9. 關閉並重新開啟 FrontEnd.mdb。

    請注意您會收到下列錯誤訊息
    找不到檔案後端 database file。請選擇新的資料檔案。
    其中 database file 會是後端資料庫的路徑和檔案名稱。

    如果您按一下 [確定 frmNewDataFile 表單會開啟以供您選取新的後端資料庫,然後重設您的資料表連結。如果您按一下 [取消] 時,您會收到下列錯誤訊息:
    連結的資料表找不到他們的來源。請登入網路,並重新啟動程式。

?考

如需有關自訂的重新整理開發 o 人 h 員 ? 工 u 具 ? 方案範例中的連結的資料表範例的詳細資訊的程式 (Solutions9.mdb),請按一下下面的文件編號,,檢視 「 Microsoft 知識庫 」 中的發行項:
154397ADT/ODE 如何修改中 Solutions.mdb RefreshTableLinks 模組
如需有關 「 封裝暨部署精靈 」 的詳細資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件:
240956MOD2000: 封裝暨部署精靈現在用來建立可散發的應用程式
236143MOD2000: 如何啟動封裝暨部署精靈

屬性

文章編號: 209862 - 上次校閱: 2005年6月23日 - 版次: 3.0
這篇文章中的資訊適用於:
  • Microsoft Access 2000 Standard Edition
關鍵字:?
kbmt kbprogramming kberrmsg kbhowto kbinfo KB209862 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:209862
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com