回答編集履歴
2
追記
answer
CHANGED
@@ -164,3 +164,38 @@
|
|
164
164
|
今回は扱っている内容がたまたまAccessDBからSQLServerへのリンクテーブルのため、その **リンクテーブルの設定値** としてSQLServerの接続文字列が登場してきますが、ADO・ADOXのコード内で直接SQLServerを操作しているものではありません。
|
165
165
|
|
166
166
|
|
167
|
+
----------
|
168
|
+
# 2016/05/24 17:14 のコメント以降の追記
|
169
|
+
|
170
|
+
> AccessDB内のリンクテーブル:strTblNameの .Properties("Jet OLEDB:Link Provider String") つまり接続文字列を、新たに設定したい接続文字列に変更。
|
171
|
+
> つまり、この更新プログラムにおいては、新たに更新したい接続文字列=既存のAccessDBのリンクテーブルへの接続文字列
|
172
|
+
> という認識でよろしいでしょうか?
|
173
|
+
|
174
|
+
いえ、ちょっとこの例がよくないのかもしれないですが、この例の場合、例えば
|
175
|
+
|
176
|
+
- 開発用DBと本番用DBが同じ構成で存在し、
|
177
|
+
- 何らかの条件で(例えば開発用フラグのようなものを用意して)、そのフラグに応じて既に設定されているリンクテーブルの接続先DBを
|
178
|
+
- 開発用DB、本番用DBで切り替える
|
179
|
+
|
180
|
+
といった動作を想定しています。
|
181
|
+
|
182
|
+
そのため、例えば現在はリンクテーブルの接続先が本番用DBとなっている場合、その時点での`Properties("Jet OLEDB:Link Provider String")` は本番用DBへの接続文字列となっています。
|
183
|
+
|
184
|
+
これを、開発用DBへのリンクテーブルに書き換えるために、
|
185
|
+
|
186
|
+
`Properties("Jet OLEDB:Link Provider String") = [開発用DBへの接続文字列]`
|
187
|
+
|
188
|
+
と変更することで接続するDBの宛先を書き換えたことになり、その他の接続情報(リモートでのテーブル名など)は開発DBと本番DBの構成が一致していることにより変更不要で、リンクテーブルの参照先が切り替わります。
|
189
|
+
|
190
|
+
なお、AccessDBの既存のリンクテーブルはこのソース上では、
|
191
|
+
|
192
|
+
`cat.Tables(strTblName)`
|
193
|
+
|
194
|
+
で表されています。
|
195
|
+
|
196
|
+
- CatalogオブジェクトとしてAccessDBの構成情報が取得されており、
|
197
|
+
- その中のTablesコレクションのインデックスstrTblName で指定される Table オブジェクトの
|
198
|
+
- プロバイダ固有プロパティ "Jet OLEDB:Link Provider String" ( = cat.Tables(strTblName).Properties("Jet OLEDB:Link Provider String")) を書き換える
|
199
|
+
|
200
|
+
という処理です。
|
201
|
+
この辺はJavaの体験を活かしてコレクションやオブジェクト、プロパティを理解するとわかりやすいのではないでしょうか。
|
1
追記
answer
CHANGED
@@ -107,4 +107,60 @@
|
|
107
107
|
> です。
|
108
108
|
|
109
109
|
テーブル名はあくまで "dbo_A" であり "[dbo_A]" ではないからではないでしょうか。
|
110
|
-
[]は主にSQL文内で利用される「区切り文字」なので、テーブル名に含めてはエラーになる気がします。
|
110
|
+
[]は主にSQL文内で利用される「区切り文字」なので、テーブル名に含めてはエラーになる気がします。
|
111
|
+
|
112
|
+
|
113
|
+
-------------------
|
114
|
+
# 2016/05/24 10:45 のコメント以降の追記
|
115
|
+
|
116
|
+
> 私が現在コードに書いている内容(実現したいこと)として、
|
117
|
+
> ・strConnection(SQLserverへの接続文字列)を使用したい
|
118
|
+
> ・ですが、当該コード
|
119
|
+
> With cat
|
120
|
+
> Set .ActiveConnection = CurrentProject.Connection '**←接続先がMSになります**
|
121
|
+
> With .Tables(strTblName)
|
122
|
+
> .Properties("Jet OLEDB:Link Provider String") = strConnection '**Jetは、MSの接続プロバイダ**
|
123
|
+
> .Properties.Refresh
|
124
|
+
> End With
|
125
|
+
> End With
|
126
|
+
>
|
127
|
+
> のように、「CurrentProject.Connection」「Jet Provider」を使用すると、MSに接続する
|
128
|
+
> ロジックになり、本質問にあるように矛盾が生じるような気がします。
|
129
|
+
|
130
|
+
このソースの意味を取り違えているようですね。
|
131
|
+
このソースは、操作対象はあくまで「AccessDB」です。
|
132
|
+
AccessDB内に、リンクテーブル、というオブジェクトを作り出す、という処理をしています。
|
133
|
+
|
134
|
+
cat (ADOXのcatalogオブジェクト)は接続したDBのカタログ〈テーブルやビューの一覧〉を管理しているオブジェクトです。
|
135
|
+
|
136
|
+
> With cat
|
137
|
+
> Set .ActiveConnection = CurrentProject.Connection
|
138
|
+
|
139
|
+
catの接続先を CurrentProject.Connection (つまり開いているAccessDB)にする。
|
140
|
+
|
141
|
+
> With .Tables(strTblName)
|
142
|
+
|
143
|
+
cat 内のテーブル:strTblName への操作(つまりAccessDBのテーブル)。
|
144
|
+
※ここで想定しているのは既にあるリンクテーブルの接続先変更なので、既存のリンクテーブルである必要がある。
|
145
|
+
|
146
|
+
> .Properties("Jet OLEDB:Link Provider String") = strConnection
|
147
|
+
|
148
|
+
AccessDB内のリンクテーブル:strTblNameの `.Properties("Jet OLEDB:Link Provider String") ` つまり接続文字列を、新たに設定したい接続文字列に変更。
|
149
|
+
|
150
|
+
> .Properties.Refresh
|
151
|
+
|
152
|
+
AccessDB内で変更を有効とするためにリフレッシュ(再読み込み)
|
153
|
+
|
154
|
+
> End With
|
155
|
+
> End With
|
156
|
+
|
157
|
+
|
158
|
+
という処理手順です。
|
159
|
+
操作対象はあくまでAccessDBですので、利用する接続はCurrentProjectですし、DB(プロバイダ)固有プロパティの名称は「Jet OLEDB:・・・」となります。
|
160
|
+
|
161
|
+
|
162
|
+
要点は「**操作対象となっているDB**が何か」です。
|
163
|
+
|
164
|
+
今回は扱っている内容がたまたまAccessDBからSQLServerへのリンクテーブルのため、その **リンクテーブルの設定値** としてSQLServerの接続文字列が登場してきますが、ADO・ADOXのコード内で直接SQLServerを操作しているものではありません。
|
165
|
+
|
166
|
+
|