プロジェクトのプロパティで設定タブにある接続文字列なんですが、これをコードで変更すれば、動的に本番系とテスト系のデータベースを切り替えられるようになります。
ところがです。
if (本番系データベースを使うもんね)
Hoge.Properties.Settings.Default.hogedbConnectionString = "本番系の接続文字列";
else
Hoge.Properties.Settings.Default.hogedbConnectionString = "テスト系の接続文字列";
なんて書くことはできない。コンパイルエラーになってしまう。これは接続文字列のスコープは強制的にアプリケーションになり、スコープがアプリケーションなものはRead Onlyだからである。
この解決方法として、VS2005まではapp.configを書き換えてスコープをユーザーにすればよかった。
でも、VS2008ではapp.configは構造が変わったらしく、無理っぽい・・・。(本当?誰か知ってたら教えて)
困った。
で、ふと思い立って、hogedbConnectionString で右クリックして「定義へ移動」を行ってみた。
public string hogedbConnectionString {
get {
return ((string)(this["hogedbConnectionString "]));
}
}
あれ? セッターが無いだけ?
てなわけでセッターを追加。
public string hogedbConnectionString {
get {
return ((string)(this["hogedbConnectionString "]));
}
set
{
this["hogedbConnectionString "] = value;
}
}
結果、これで見事にHoge.Properties.Settings.Default.hogedbConnectionString をコードから変更できるようなった。
注意としては、VS2008のデザイナをいじる度に、つまりプロジェクトのプロパティで設定タブにおける内容をいじる度にセッターが消えてしまうんで、また追加してあげなければならないということです。もっとも、消えたままだとコンパイルエラーになるんで追加し忘れることはありませんが。
もう一つ注意点。TableAdapterの内部でもHoge.Properties.Settings.Default.hogedbConnectionString が使われているわけであり、これもそのまま本番系、テスト系に切り替わるので思い通りなのですが、TableAdapterは最初にHoge.Properties.Settings.Default.hogedbConnectionString の内容を取り込むと、以降、二度と取り込みません。つまり、TableAdapterを一度でも使用した後は、接続文字列を変更できないということです。
(参考)
TableAdapterがインスタンス化されただけでは、まだ接続文字列を取り込んでいないので、接続文字列を切り替えることができます。
以上より、本番系、テスト系を切り替えるのは、アプリケーションの起動時に一度だけ行うのが良いでしょう。