web-dev-qa-db-ja.com

ODBCが変更されたときにAccess mdbのリンクテーブルを更新する方法

Access mdbを作成し、リンクテーブルをODBC経由でSQL Serverデータベースに追加できます。 ODBCがODBCコントロールパネルアプレットを使用して接続しているSQL Serverを変更すると、Accessが再起動されるまでmdbは元のSQL Serverに接続したままになります。

Accessを再起動せずにこれらのリンクサーバーテーブルを再リンクする方法はありますか?

編集:これをコードで実行したい

11
BTB

以下のコードを使用して、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メソッドのAccessヘルプもご覧ください。

コードバージョン1

再リンクの従来の方法ですが、RefreshODBCLinksが呼び出される前にテーブルが使用されている場合、Accessは接続情報をメモリに保持する可能性があります。

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を使用して新しいテーブルが作成されます。
これをテストし、必要に応じてエラーをより適切に処理するためのコードを追加してください。

ODBCテーブルの作成中に渡されたパラメータdbAttachSavePWDは、ODBCパスワード(ある場合))をAccessに保存します。削除するだけです。それが必要なものでない場合は、.

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

最後に、変更を表示するためにAccessを再起動する必要がある問題が引き続き発生する場合は、 でコードを確認してください。データベースをプログラムで再起動して圧縮します 私のサイト。

注:コードバージョン2は、一部は このAccess Web記事 から着想を得ています。

29
Renaud Bompuis

どのバージョンのAccessを使用していますか? 2000年には、[ツール]> [データベースユーティリティ]> [リンクテーブルマネージャー]に移動して、設定を変更できます。

5
Dinci Garrone