http://blogs.wankuma.com/rti/archive/2007/07/18/85677.aspx
TableAdapter で悩む
の続きです。
問題となっているのは、DataSet のデザイナを利用して TableAdapter を作った場合の接続文字列についてです。
例えば、設定画面で接続に必要な諸々のデータを登録して、これに基づいて実行時に接続文字列を生成して接続するというような場合の対応方法で悩んでいます。
何故なら、そのままの状態では接続文字列を実行中に変更することができませんし、接続文字列を無理に変更してしまうと、その後に DataSet をデザイナで変更できなくなってしまうためです。
では、どうすれば
実行時に接続文字列を変更
できるのでしょうか?
以下は、VS2005(C#)で、これを実現するための方法です。
掲示板などでも、同様の問題で悩んでいらっしゃる方を何度かお見かけしたことがあったので、いつもお世話になっているえムナウ先生に教えていただいたものを、僕なりにまとめておくことにします。
(1) プロジェクトのプロパティ(Properties)の「設定」タブに登録されている接続文字列もバックアップをとっておく。
(2) 現在できあがっている DataSet をコピーしてバックアップとしておく。
(3) 元々あった接続文字列の型を「接続文字列」から「String」に変更する。
(4) スコープを「アプリケーション」から「ユーザー」に変更する。
(5) 接続文字列を空白にする。(これは、コードで指定した接続文字列が正しく機能していない場合の発見を助けるためです)
これによって、以下のように接続文字列を変更できるようになります。
global::ProjectName.Properties.Settings.Default.HogeConnectionString
= "好きな接続文字列";
ちなみに、ファイルのバックアップをうまく行うコツとしては、ソリューションエクスプローラーで「すべてのファイルを表示」としておいて、コピーしたファイルをプロジェクトから削除しておく方法がお勧めです。
この方法で、注意しなければならないのは、以下の2点です。
(1) TableAdapter オブジェクトの Connection プロパティが最初に参照された時点で、TableAdapter の Connection オブジェクトは既に生成され、その時点の接続文字列が設定されます。
従って、接続文字列を実行時に変更する場合は、ソフトウェアの起動時など、全ての Connection オブジェクトが生成される前でなければなりません。
3階層レイヤ構成でデータアクセス層のアセンブリを分けている人は、接続文字列連絡用の Static クラスでも作ってあげれば良いでしょう。
ただ、設定画面でユーザーが自ら接続に関わるデータを変更した場合は、即時に対応させるのに工夫が必要になります。
(2) DataSet をデザイナで変更する場合は、接続文字列の型とスコープと値をバックアップの接続文字列と同じにしてから行うようにします。
この時、僕の環境では値は再度入力ではなく、値を入力する際の入力支援用のボタンで接続のプロパティを呼び出して、ここで再度設定するようにした方が安定するようです。
変更しおえたら再び上記の(2)~(5)を行います。
万一 DataSet が壊れてしまった場合は、バックアップを元に復元できる筈です。
また、DataSet の TableAdapter の Connection プロパティから、直接接続文字列を設定したり生成できます。
必要に応じて、こちらの設定も必要になるかもしれません。
* 実施は、各人の責任において行ってください。