2009-02-19 6 views
11

Ich kann eine Access mdb erstellen und eine verknüpfte Tabelle zu einer SQL Server-Datenbank via ODBC hinzufügen. Wenn ich den Sql-Server, mit dem die ODBC Verbindung herstellt, mit dem ODBC-Steuerungsfeld-Applet ändert, stellt der MDB weiterhin eine Verbindung mit dem ursprünglichen Sql-Server her, bis Access neu gestartet wird.Aktualisieren von verknüpften Tabellen in einem Access mdb, wenn ODBC ändert

Gibt es eine Möglichkeit, diese verknüpften Servertabellen neu zu verknüpfen, ohne Access neu zu starten?

EDIT: Ich möchte diese

Antwort

29

Sie können den folgenden Code verwenden, um alle ODBC-Tabellen in Ihrem Access-Projekt auf einen bestimmten DSN zu aktualisieren.

Wie man es verwendet

einfach den Code kopieren in einem neuen oder vorhandenen VBA-Modul und, wo Sie die Links aktualisieren möchten, rufen Sie es mit der richtigen DSN für die neue ODBC-Verbindung:

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

Schauen Sie sich auch die Access-Hilfe für die TableDef.RefreshLink Methode an.

-Code-Version 1

klassischer Art und Weise von dem Linken aber Zugriff kann Verbindungsinformationen im Speicher halten, wenn die Tabellen vor RefreshODBCLinks genannt wird verwendet wurden.

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 

-Code-Version 2

Dies wird komplett neu erstellen, um die ODBC-verknüpfte Tabellen: die alten, dann neue Tabellen des angegebenen DSN umbenannt werden verwendet, werden die alte verknüpfte Version vor dem Löschen erstellt werden .
Bitte stellen Sie sicher, dass Sie dies testen und eventuell Code hinzufügen, um Fehler besser zu behandeln.

Beachten Sie auch, dass der Parameter dbAttachSavePWD, der während der Erstellung der ODBC-Tabelle übergeben wurde, das ODBC-Kennwort (falls vorhanden) in Access speichert. Entfernen Sie es einfach, wenn Sie das nicht brauchen.

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 

Eine letzte Sache: Wenn Sie immer noch Probleme bekommen, die erfordern, dass Sie Access für die Änderungen neu starten, einen Blick auf meinen Code in Restarting and compacting the database programmatically auf meiner Seite sichtbar sein, dann haben.

Hinweis: Code Version 2 wurde teilweise von this Access Web article inspiriert.

+1

Es wäre eine sehr gute Idee, Systemtabellen auszuschließen, dh Tabellen, die „MSys“ – Fionnuala

+1

OK, aber warum sollten sie eine Verbindungszeichenfolge, beginnend mit „ODBC“ beginnen? Sie würden auf jeden Fall nicht übereinstimmen. –

+1

Es scheint für mich zu funktionieren, aber nur wenn ich die Verbindungszeichenfolge ändere. Wenn ich den Server in ODBC ändere, verbindet sich die Linked-Tabelle immer noch mit dem ursprünglichen Server, nachdem ich RefreshODBCLinks aufgerufen habe. Wenn ich den Datenbanknamen in der Verbindungszeichenfolge ändere, wird der Verbindungsserver aktualisiert. – BTB

5

in Code tun, was Access-Version verwenden Sie? Im Jahr 2000 können Sie unter Extras> Datenbankdienstprogramme> Linked Table Manager Ihre Einstellungen ändern.

+0

Danke - du hast recht es funktioniert, wenn ich den Tabellenverknüpfungs-Manager und das Kontrollkästchen „Immer nach neuem Standort-Eingabe“ verwenden und dann wieder die ODBC wählen. Ich möchte die Tabelle jedoch in Code neu verknüpfen - ich werde meine Frage bearbeiten, um dies zu verdeutlichen. – BTB

+0

Warum möchten Sie Ihren Tisch neu verknüpfen? Was wird dadurch erreicht werden? – Brettski

+1

Der ODBC wird geändert auf einem anderen Server/Datenbank zeigen - aber die Access-App ist der Wechsel bis zu seinem Neustart nicht bewusst. – BTB

Verwandte Themen