2009-02-19 135 views
11

我可以創建Access mdb並通過ODBC將鏈接表添加到Sql Server數據庫。如果使用ODBC控制面板小程序更改ODBC連接到的Sql Server,則mdb仍會連接到原始Sql Server,直到Access重新啓動。如何在ODBC更改時刷新Access mdb中的鏈接表

有沒有辦法重新鏈接這些鏈接的服務器表,而無需重新啓動Access?

編輯:我想在代碼中這樣做

回答

29

您可以使用下面的代碼以刷新您的Access項目中的所有ODBC表給定的DSN。

如何使用它

只需將代碼複製一個新的或現有的VBA模塊中,要刷新的聯繫,與新ODBC連接正確的DSN稱之爲:

RefreshODBCLinks "ODBC;DRIVER=SQL Server Native Client 10.0;" & _" 
       "SERVER=SQLSERVER;UID=Administrator;" & _ 
       "Trusted_Connection=Yes;" & _ 
       "APP=2007 Microsoft Office system;DATABASE=OrderSystem;" 

而且,看看在TableDef.RefreshLink方法的訪問幫助。

代碼版本1重新鏈接,但訪問可以保持連接信息在內存中,如果已使用的表RefreshODBCLinks調用之前的

經典方式。

Public Sub RefreshODBCLinks(newConnectionString As String) 
    Dim db As DAO.Database 
    Dim tb As DAO.TableDef 
    Set db = CurrentDb 
    For Each tb In db.TableDefs 
     If Left(tb.Connect, 4) = "ODBC" Then 
      tb.Connect = newConnectionString 
      tb.RefreshLink 
      Debug.Print "Refreshed ODBC table " & tb.Name 
     End If 
    Next tb 
    Set db = Nothing 
End Sub 

代碼版本2

這將徹底重新創建ODBC鏈接表:舊的將被重命名,然後使用給定的DSN的新表將被創建刪除舊的鏈接的版本之前。
請確保你測試了這個,並且可能會添加一些代碼,以便在必要時更好地處理錯誤。

還要注意參數dbAttachSavePWD創建ODBC表將保存ODBC密碼(如果有的話)訪問的過程中傳遞。如果這不是您需要的,請將其刪除。

Public Sub RefreshODBCLinks(newConnectionString As String) 
    Dim db As DAO.Database 
    Dim tb As DAO.TableDef 
    Dim originalname As String 
    Dim tempname As String 
    Dim sourcename As String 
    Dim i As Integer 

    Set db = CurrentDb 
    ' Get a list of all ODBC tables ' 
    Dim tables As New Collection 
    For Each tb In db.TableDefs 
     If (Left(tb.Connect, 4) = "ODBC") Then 
      tables.Add Item:=tb.Name, key:=tb.Name 
     End If 
    Next tb 

    ' Create new tables using the given DSN after moving the old ones ' 
    For i = tables.count To 1 Step -1 
      originalname = tables(i) 
      tempname = "~" & originalname & "~" 
      sourcename = db.TableDefs(originalname).SourceTableName 
      ' Create the replacement table ' 
      db.TableDefs(originalname).Name = tempname 
      Set tb = db.CreateTableDef(originalname, dbAttachSavePWD, _ 
             sourcename, newConnectionString) 
      db.TableDefs.Append tb 
      db.TableDefs.Refresh 
      ' delete the old table ' 
      DoCmd.DeleteObject acTable, tempname 
      db.TableDefs.Refresh 
      tables.Remove originalname 
      Debug.Print "Refreshed ODBC table " & originalname 
    Next i 
    Set db = Nothing 
End Sub 

最後一兩件事:如果你仍然收到這個要求重新啓動,以使更改是可見的訪問問題,然後看看我的代碼在Restarting and compacting the database programmatically我的網站上。

注:代碼版本2的一部分是從this Access Web article啓發。

5

您使用的是什麼版本的Access?在2000年,您可以轉到工具>數據庫實用程序>鏈接表管理器來更改您的設置。

+0

感謝 - 你是對的它工作,如果我使用鏈接表管理器,並選中「始終提示輸入新位置」,然後再次選擇ODBC。我想用代碼重新鏈接表格 - 我將編輯我的問題以清楚地說明問題。 – BTB 2009-02-19 11:59:59

+0

爲什麼你想重新連接你的桌子?這樣做會得到什麼? – Brettski 2009-02-24 04:56:30

相關問題