- PR -

ODBCの矛先変更について

1
投稿者投稿内容
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2006-01-13 15:38
こんにちは。
Accessについてお知恵を拝借したいと思います。

Access2000でODBCでOracle8にテーブルをリンクしているのですが、
Oracleをバージョンアップするので、接続先を変更したいのですが、
一括で変更する方法はあるのでしょうか?
# MSysObejectテーブルのConnectカラム値を更新できればよいのですが、
# 読み取り専用で更新できないようです。

どなたか、ご存知の方がいらっしゃったら、ご返信いただけるとありがたいです。
鎌田
常連さん
会議室デビュー日: 2003/09/23
投稿数: 45
投稿日時: 2006-01-14 01:21
DAOのTabledefsコレクションでconnectプロパティが"ODBC;"で始まるテーブルについて、そのTabledefオブジェクトのConnectプロパティの内容を新しいODBC接続文字列に変更し、RefreshLinkメソッドで更新を行うという方法でいけると思います。

"いけます"でなくて"思います"なのは、ODBC接続のPostgreSQLのテーブルへのリンクを作成したり、外部MDBファイルのテーブルリンクのパスを更新したことはありますが、ODBC接続のデータソースのリンクテーブルを書き換えたことがないためです。
鎌田
常連さん
会議室デビュー日: 2003/09/23
投稿数: 45
投稿日時: 2006-01-14 01:35
PostgreSQLで確認したところ、↓でも動きました。
ACCESSのリンク機能で作られた元のconnectプロパティの内容は、DSNのパラメータをすべて展開しているようですが、"ODBC;DSN=test2"だけでもリンクテーブルおよびそれを使ったクエリも動作しているように見えます。

Public Sub ChangeODBCLink()
Dim connectString As String
connectString = "ODBC;DSN=test2;UID=postgres;PWD=xxxx"

Dim tdf As TableDef
Dim db As Database
Set db = CurrentDb
For Each tdf In db.TableDefs
If tdf.Attributes = dbAttachedODBC Then
Debug.Print "old: "; tdf.Connect;
tdf.Connect = connectString
tdf.RefreshLink
Debug.Print " new:"; tdf.Connect
End If
Next
End Sub
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2006-01-16 10:54
鎌田様

ご返信ありがとうございました。
私も、以下のようにして矛先変更ができたのですが、
鎌田様のサンプルのほうがスッキリしているようです。
試してみます。

--------------------------------------------------------------------
SELECT
MSysObjects.Connect,
MSysObjects.ForeignName,
MSysObjects.Id,
MSysObjects.Name
FROM
MSysObjects
WHERE
MSysObjects.ForeignName IS NOT NULL;

でForeignNameとNameを配列(s_ForeignName(n), s_Name(n))に保存して、
下記のように対処しました。
FOR ...
DoCmd.TransferDatabase acLink, "ODBC データベース", _
"ODBC;DSN=xxx;UID=xxxxx;PWD=xxxxxxx;" & _
"DATABASE=zzz", acTable, s_ForeignName(n), s_Name(n)
NEXT ...
--------------------------------------------------------------------
1

スキルアップ/キャリアアップ(JOB@IT)