質問するログイン新規登録

回答編集履歴

2

追記

2016/05/24 08:41

投稿

kaz.Suenaga
kaz.Suenaga

スコア2042

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

追記

2016/05/24 08:41

投稿

kaz.Suenaga
kaz.Suenaga

スコア2042

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
+