Server

【Sqlserver】複製したデータベースにAccessで接続しストアドが動くのかの実験(データベース複製実験3)

リンクテーブルODBC情報をVBAで一括変換

【Sqlserver】データベースを複製してAccessで動くようにODBC設定VBAの実験準備(データベース複製実験2)



AccessのSqlServerからのリンクテーブルが増えるといちいち修正するのが面倒になります。

そこで、一括でODBCの変換できるVBAを使って変換してみました。

 

リンクテーブル変更ボタンをクリックすると、下記のVBAコードが動いて一括でリンクテーブルが変更になります。

Private Sub link_t_btn_Click()

Dim db As DAO.DATABASE, tb As DAO.TableDef
Dim strCon As String
 
Dim idns As String
Dim idatabase As String
Dim iuid As String
Dim ipwd As String
'Dim iserver As String

idns = DNS
idatabase = DATABASE
iuid = UID
ipwd = PWD
'iserver = SERVER
 
'接続文字列(データソースレス接続形式)
'strCon = "Driver={SQL Server};DATABASE=" & idatabase & ";UID=" & iuid & ";PWD=" & ipwd & ";SERVER=" & iserver & ""

strCon = "ODBC;DSN=" & idns & ";DATABASE=" & idatabase & ";UID=" & iuid & ";PWD=" & ipwd & ""

    Set db = CurrentDb

    For Each tb In db.TableDefs
        If tb.Connect <> "" Then
            tb.Connect = strCon
            tb.RefreshLink
        End If
    Next tb

MsgBox "終了しました。"

End Sub

上のコードでコメントアウトしている、

サーバー名は必要ない

ようです。

ODBC;Driver={SQL Server}を使う場合は、サーバー名が必要になりますが、

ODBC;DSN=の場合は、サーバー名は省略できるようです。

パススルークエリのODBC情報をVBAで一括変換

パススルークエリのODBCの接続プロパティを見ると下記のようになっていました。

ODBC;DSN=ODBC1;UID=user1;PWD=japan2020$$;DATABASE=DB1;LANGUAGE=日本語

パススルークエリのODBC接続情報もリンクテーブルと同じようです。

Private Sub pass_query_btn_Click()
Dim O As Object
Dim db As DAO.DATABASE
Dim pass_q As DAO.QueryDef

Dim idns As String
Dim idatabase As String
Dim iuid As String
Dim ipwd As String
'Dim iserver As String

idns = DNS
idatabase = DATABASE
iuid = UID
ipwd = PWD
'iserver = SERVER
 

Set db = CurrentDb

For Each O In Application.CurrentData.AllQueries
Set pass_q = db.QueryDefs(O.name)

'pass_q.Connect = "ODBC;DSN=" & idns & ";UID=" & iuid & ";PWD=" & ipwd & ";DATABASE=" & idatabase & ";LANGUAGE=日本語"

pass_q.Connect = "ODBC;DSN=" & idns & ";DATABASE=" & idatabase & ";UID=" & iuid & ";PWD=" & ipwd & ""

Next

MsgBox "終了しました。"


End Sub

ここで大問題です。

ココに注意

普通のクエリもODBC接続設定がされてしまい壊されます。

パススルークエリだけを選んでODBC設定する方法を探しましたが見つかりませんでした。

自分のスキルではこの問題は乗り越えられそうもないので諦めます。

現時点の苦肉の対応策

全てのクエリがパススルークエリとみなされてODBC設定をされてしまうので、苦肉の策として、

注意ポイント

(1)コピーAccess(DB2)の方の普通のクエリを削除

(2)クエリODBC一括変換にてパススルークエリの設定

(3)コピー元Access(DB1)から、パススルークエリ以外をインポート

手動ですが、そんなにデータベースを頻繁に増やして作業するということはないので、この部分だけは仕方ないですね。

AccessVBAのストアド呼び出しコードの変更

AccessのVBAでストアドを実行させていますが、そのODBC接続設定も変更しなければなりません。

検索で変更箇所はでてくるものでしょうか!?

変更箇所は、下記の部分になりますので、「ODBC1」とか、「接続文字列」とかで検索かけ見ようと思います。

'接続文字列の設定
cn.ConnectionString = "DSN=ODBC1;Uid=user1;Pwd=japan2020$$;Database=DB1"

通常のVBA以外に、標準モジュール(Functionで作成したもの)にも実験の為に、ストアド実行するコードを入れてみました。

検索の対象で4種類の検索方法があるようなので意味をしらべてみました。

今回は、全てのODBC設定を変更したいので、この場合は、「カレントプロジェクト」を選択すればいいらしい。

検索して手修正するのが面倒な場合は置換もできるので、この方が早いですね。

置換で、ODBC1からODBC2に変更し、user1からuser2に、DB1からDB2変更した。

この実験の結果

この実験の目的は、

ココがポイント

データベースを複製して、同じ仕組みを何個も作ることができるのか!?

という事でした。

 

特にデータベースを複製すると、ストアドがうまく動かないのではないか?という不信感があったので実験をすることにしましたが、結果はうまく動くことが確認できました。

ボタン一回でデータベースが複製できてODBC接続設定もできればいいのだが、そこまでシンプルには行きそうにもありません。

しかし、

とりあえず、複製して同じ仕組みを提供できることが分かった

ので良しとします。

 

ただ、注意点として今回の作業内容の他に、

 

ココに注意

SqlServer側でバッチファイルなどでストアドを動かしている場合はバッチファイルの修正も必要になる

 

ので注意してください。

 

 

-Server
-, , , ,

Translate »

© 2020 PCTips