2009-02-19 10 views
11

Mogę utworzyć plik mdb programu Access i dodać połączoną tabelę do bazy danych serwera SQL za pośrednictwem ODBC. Jeśli zmienię serwer Sql, z którym ODBC łączy się z apletem panelu sterowania ODBC, to mdb nadal łączy się z oryginalnym serwerem SQL, dopóki nie zostanie ponownie uruchomiony program Access.Jak odświeżyć tabele połączone w pliku mdb programu Access, gdy zmieni się ODBC.

Czy istnieje sposób na ponowne połączenie tych połączonych tabel serwerów bez ponownego uruchamiania programu Access?

EDIT: Chciałbym to zrobić w kodzie

Odpowiedz

29

Możesz użyć poniższego kodu, aby odświeżyć wszystkie tabele ODBC w projekcie programu Access do danej nazwy DSN.

Jak korzystać

Wystarczy skopiować kod do nowego lub istniejącego modułu VBA i, gdzie chcesz, aby odświeżyć linki, nazywają go z właściwego DSN dla nowego połączenia ODBC:

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

Zobacz także pomoc dostępu do metody TableDef.RefreshLink.

Kod wersja 1

klasyczny sposób relinkowania ale dostęp do informacji o połączeniach można zachować w pamięci, jeśli stoły były używane przed RefreshODBCLinks nazywa.

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 

wersja kodu 2

To będzie całkowicie ponownie utworzyć tabele połączone ODBC: stare nich zostanie zmieniona, wówczas nowe tabele przy użyciu danego DSN zostanie utworzony przed usunięciem starej wersji połączonej .
Upewnij się, że to przetestujesz i możesz dodać kod, aby lepiej radzić sobie z błędami, jeśli to konieczne.

Należy również zauważyć, że parametr dbAttachSavePWD przekazany podczas tworzenia tabeli ODBC zapisze hasło ODBC (jeśli istnieje) w programie Access. Po prostu go usuń, jeśli nie tego potrzebujesz.

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 

Ostatnia sprawa: jeśli wciąż się problemy, które wymagają ponownego uruchomienia dostępu, aby zmiany były widoczne, a następnie spojrzeć na mojego kodu w Restarting and compacting the database programmatically na moim miejscu.

Uwaga: Kod wersji 2 został zainspirowany częściowo z wersji this Access Web article.

+1

Byłoby bardzo dobrym pomysłem, aby wykluczyć tabele systemowe, czyli tabele rozpoczynające "MSys" – Fionnuala

+1

OK, ale dlaczego miałyby ciąg połączenia zaczynający się od "ODBC"? W żadnym wypadku nie pasują do tego. –

+1

Wygląda na to, że działa dla mnie, ale tylko wtedy, gdy zmienię ciąg połączenia. Jeśli zmienię, powiedz serwer w ODBC, to tabela Linked nadal łączy się z oryginalnym serwerem po wywołaniu RefreshODBCLinks. Jeśli zmienię nazwę bazy danych w ciągu połączenia, serwer połączony zostanie odświeżony. – BTB

5

Jaka wersja Dostęp używasz? W 2000 roku możesz przejść do menu Narzędzia> Narzędzia bazy danych> Menedżer powiązanego stołu, aby zmienić ustawienia.

+0

Dzięki - masz rację, działa, jeśli korzystam z Menedżera tabel połączonych i zaznacz pole "Zawsze pytaj o nową lokalizację", a następnie ponownie wybierz ODBC. Chciałbym jednak ponownie połączyć tabelę w kodzie - opiszę to pytanie, aby to wyjaśnić. – BTB

+0

Dlaczego chciałbyś połączyć swój stół? Co zyska się dzięki temu? – Brettski

+1

ODBC został zmieniony tak, aby wskazywał inny serwer/bazę danych - ale aplikacja Access nie jest świadoma zmiany, dopóki nie zostanie ponownie uruchomiona. – BTB

Powiązane problemy