The road to C# master trapemiya

C#を中心に、.NETの話題を取り上げます。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  251  : 記事  1  : コメント  590  : トラックバック  30

ニュース

Since 2005年10月26日

わんくま同盟

わんくま同盟

Microsoft MVP


Visual Developer - Visual C#

記事カテゴリ

書庫

日記カテゴリ

プロジェクトのプロパティで設定タブにある接続文字列なんですが、これをコードで変更すれば、動的に本番系とテスト系のデータベースを切り替えられるようになります。
ところがです。

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がインスタンス化されただけでは、まだ接続文字列を取り込んでいないので、接続文字列を切り替えることができます。

以上より、本番系、テスト系を切り替えるのは、アプリケーションの起動時に一度だけ行うのが良いでしょう。

投稿日時 : 2008年3月21日 17:01

コメント

# re: スコープがアプリケーションな接続文字列を動的に変更する方法(テスト系データベースと本番系データベースを動的に切り替える方法) 2008/03/21 17:09 trapemiya
考えてみると、接続文字列のスコープがユーザーに変更できればいいんですよね。どうもこの辺りが昔から融通がきかないなぁ。connectに改善要望出てるかなぁ? あとで見てみよう。

# re: スコープがアプリケーションな接続文字列を動的に変更する方法(テスト系データベースと本番系データベースを動的に切り替える方法) 2008/04/28 13:05 k_kazu
参考になりました。
> 注意としては、VS2008のデザイナをいじる度に、つまりプロジェクトのプロパティで設定タブにおける内容をいじる度にセッターが消えてしまう

これは、 partial class にして プロパティー名を変更する方がメンテナンス性が良いと思うのですが・・。
internal partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
#if DEBUG
public string hogedbConnectionString_Debug
{
set
{
this["TESTConnectionString"] = value;
}
}
#endif
}



# re: スコープがアプリケーションな接続文字列を動的に変更する方法(テスト系データベースと本番系データベースを動的に切り替える方法) 2008/05/01 14:49 trapemiya
k_kazuさん。partial classに書き込んでしまう方法ですが、素晴らしいです! 気づきませんでした。言われてみれば納得です。早速実践します。ありがとうございました。

# re: スコープがアプリケーションな接続文字列を動的に変更する方法(テスト系データベースと本番系データベースを動的に切り替える方法) 2009/04/03 13:53 3流プログラマ
partial classにして、プロパティにセッター加えるとできるんですね。非常に参考になりました。
でも、セッター作っても、プリケーション構成ファイルにはsaveできないんですよね。
なんかいい方法ないでしょうか。。。

# re: スコープがアプリケーションな接続文字列を動的に変更する方法(テスト系データベースと本番系データベースを動的に切り替える方法) 2009/04/03 17:35 trapemiya
>でも、セッター作っても、プリケーション構成ファイルにはsaveできないんですよね。

プロジェクトのプロパティの設定タブのところで他の接続文字列を追加し、それを使うようにしてはいかがでしょうか?

たぶん、

internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{

public string HogedbConnectionStringEx
{
get
{
return ((string)(this["HogedbConnectionString"]));
}
set
{
this["HogedbConnectionString"] = value;
}
}
}

な感じで作られていると思いますので、そのセッターに先の接続文字列をセットするようにします。

#質問の意味を取り違えているかもしれませんが・・・


Post Feedback

タイトル
名前
Url:
コメント