回答編集履歴

2

追記

2016/05/24 08:41

投稿

kaz.Suenaga
kaz.Suenaga

スコア2037

test CHANGED
@@ -330,4 +330,72 @@
330
330
 
331
331
 
332
332
 
333
-
333
+ ----------
334
+
335
+ # 2016/05/24 17:14 のコメント以降の追記
336
+
337
+
338
+
339
+ > AccessDB内のリンクテーブル:strTblNameの .Properties("Jet OLEDB:Link Provider String") つまり接続文字列を、新たに設定したい接続文字列に変更。
340
+
341
+ > つまり、この更新プログラムにおいては、新たに更新したい接続文字列=既存のAccessDBのリンクテーブルへの接続文字列
342
+
343
+ > という認識でよろしいでしょうか?
344
+
345
+
346
+
347
+ いえ、ちょっとこの例がよくないのかもしれないですが、この例の場合、例えば
348
+
349
+
350
+
351
+ - 開発用DBと本番用DBが同じ構成で存在し、
352
+
353
+ - 何らかの条件で(例えば開発用フラグのようなものを用意して)、そのフラグに応じて既に設定されているリンクテーブルの接続先DBを
354
+
355
+ - 開発用DB、本番用DBで切り替える
356
+
357
+
358
+
359
+ といった動作を想定しています。
360
+
361
+
362
+
363
+ そのため、例えば現在はリンクテーブルの接続先が本番用DBとなっている場合、その時点での`Properties("Jet OLEDB:Link Provider String")` は本番用DBへの接続文字列となっています。
364
+
365
+
366
+
367
+ これを、開発用DBへのリンクテーブルに書き換えるために、
368
+
369
+
370
+
371
+ `Properties("Jet OLEDB:Link Provider String") = [開発用DBへの接続文字列]`
372
+
373
+
374
+
375
+ と変更することで接続するDBの宛先を書き換えたことになり、その他の接続情報(リモートでのテーブル名など)は開発DBと本番DBの構成が一致していることにより変更不要で、リンクテーブルの参照先が切り替わります。
376
+
377
+
378
+
379
+ なお、AccessDBの既存のリンクテーブルはこのソース上では、
380
+
381
+
382
+
383
+ `cat.Tables(strTblName)`
384
+
385
+
386
+
387
+ で表されています。
388
+
389
+
390
+
391
+ - CatalogオブジェクトとしてAccessDBの構成情報が取得されており、
392
+
393
+ - その中のTablesコレクションのインデックスstrTblName で指定される Table オブジェクトの
394
+
395
+ - プロバイダ固有プロパティ "Jet OLEDB:Link Provider String" ( = cat.Tables(strTblName).Properties("Jet OLEDB:Link Provider String")) を書き換える
396
+
397
+
398
+
399
+ という処理です。
400
+
401
+ この辺はJavaの体験を活かしてコレクションやオブジェクト、プロパティを理解するとわかりやすいのではないでしょうか。

1

追記

2016/05/24 08:41

投稿

kaz.Suenaga
kaz.Suenaga

スコア2037

test CHANGED
@@ -217,3 +217,117 @@
217
217
  テーブル名はあくまで "dbo_A" であり "[dbo_A]" ではないからではないでしょうか。
218
218
 
219
219
  []は主にSQL文内で利用される「区切り文字」なので、テーブル名に含めてはエラーになる気がします。
220
+
221
+
222
+
223
+
224
+
225
+ -------------------
226
+
227
+ # 2016/05/24 10:45 のコメント以降の追記
228
+
229
+
230
+
231
+ > 私が現在コードに書いている内容(実現したいこと)として、
232
+
233
+ > ・strConnection(SQLserverへの接続文字列)を使用したい
234
+
235
+ > ・ですが、当該コード
236
+
237
+ > With cat
238
+
239
+ > Set .ActiveConnection = CurrentProject.Connection '**←接続先がMSになります**
240
+
241
+ > With .Tables(strTblName)
242
+
243
+ > .Properties("Jet OLEDB:Link Provider String") = strConnection '**Jetは、MSの接続プロバイダ**
244
+
245
+ > .Properties.Refresh
246
+
247
+ > End With
248
+
249
+ > End With
250
+
251
+ >
252
+
253
+ > のように、「CurrentProject.Connection」「Jet Provider」を使用すると、MSに接続する
254
+
255
+ > ロジックになり、本質問にあるように矛盾が生じるような気がします。
256
+
257
+
258
+
259
+ このソースの意味を取り違えているようですね。
260
+
261
+ このソースは、操作対象はあくまで「AccessDB」です。
262
+
263
+ AccessDB内に、リンクテーブル、というオブジェクトを作り出す、という処理をしています。
264
+
265
+
266
+
267
+ cat (ADOXのcatalogオブジェクト)は接続したDBのカタログ〈テーブルやビューの一覧〉を管理しているオブジェクトです。
268
+
269
+
270
+
271
+ > With cat
272
+
273
+ > Set .ActiveConnection = CurrentProject.Connection
274
+
275
+
276
+
277
+ catの接続先を CurrentProject.Connection (つまり開いているAccessDB)にする。
278
+
279
+
280
+
281
+ > With .Tables(strTblName)
282
+
283
+
284
+
285
+ cat 内のテーブル:strTblName への操作(つまりAccessDBのテーブル)。
286
+
287
+ ※ここで想定しているのは既にあるリンクテーブルの接続先変更なので、既存のリンクテーブルである必要がある。
288
+
289
+
290
+
291
+ > .Properties("Jet OLEDB:Link Provider String") = strConnection
292
+
293
+
294
+
295
+ AccessDB内のリンクテーブル:strTblNameの `.Properties("Jet OLEDB:Link Provider String") ` つまり接続文字列を、新たに設定したい接続文字列に変更。
296
+
297
+
298
+
299
+ > .Properties.Refresh
300
+
301
+
302
+
303
+ AccessDB内で変更を有効とするためにリフレッシュ(再読み込み)
304
+
305
+
306
+
307
+ > End With
308
+
309
+ > End With
310
+
311
+
312
+
313
+
314
+
315
+ という処理手順です。
316
+
317
+ 操作対象はあくまでAccessDBですので、利用する接続はCurrentProjectですし、DB(プロバイダ)固有プロパティの名称は「Jet OLEDB:・・・」となります。
318
+
319
+
320
+
321
+
322
+
323
+ 要点は「**操作対象となっているDB**が何か」です。
324
+
325
+
326
+
327
+ 今回は扱っている内容がたまたまAccessDBからSQLServerへのリンクテーブルのため、その **リンクテーブルの設定値** としてSQLServerの接続文字列が登場してきますが、ADO・ADOXのコード内で直接SQLServerを操作しているものではありません。
328
+
329
+
330
+
331
+
332
+
333
+