Access mdbを作成し、リンクテーブルをODBC経由でSQL Serverデータベースに追加できます。 ODBCがODBCコントロールパネルアプレットを使用して接続しているSQL Serverを変更すると、Accessが再起動されるまでmdbは元のSQL Serverに接続したままになります。
Accessを再起動せずにこれらのリンクサーバーテーブルを再リンクする方法はありますか?
編集:これをコードで実行したい
以下のコードを使用して、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記事 から着想を得ています。
どのバージョンのAccessを使用していますか? 2000年には、[ツール]> [データベースユーティリティ]> [リンクテーブルマネージャー]に移動して、設定を変更できます。