デバッグ環境と本番環境で接続文字列が異なるケースがあり、動的に接続文字列を変更できれば便利だと前から思っていたのだが、型付Dataset内のTableAdapterの接続文字列は結局それらのコンストラクタで global::ProjName.Properties.Settings.Default.ConnectionString; などのようにapp.configのConnectionStringを読み込んでおり、しかもこれがReadOnlyなプロパティだったので、変更するのは無理ではないかと思っていた。ググってみるとSettings.settingsで接続文字列のスコープをアプリケーションからユーザーに変更するとプロパティが書き込み可能になるらしい。たしかにわかりやすい方法だ。でもIDEのデザイナが作ったコードを手で書き換えるのが気持ち悪い。何かわけがあってアプリケーションスコープなのではないだろうか。もう少し調べるとVS2008からSetterがなくなったので自分でSetterを追加とかしないといけないし、IDEが何かするたびにコードを再生成されちゃうので追加したSetterも消えてしまうようだ。ていうかやっぱりIDEが自動生成したコードに手を入れるのがきもちわるい!最近C#のリフレクションの使い方が少しわかってきたので、別の方法でやってみた。以下試行錯誤の結果。
{ var propertyDefault = typeof(global::MyLib.Properties.Settings).GetProperty("Default"); object objectSettings = propertyDefault.GetValue(null, null); var propertyInfo = typeof(global::MyLib.Properties.Settings).GetProperty("Item"); var indexerName = new object[] { "ConnectionString" }; var con = "Data Source=localhost;Initial Catalog=THEDB;Integrated Security=True"; propertyInfo.SetValue(objectSettings, con, indexerName); }
以上。試行錯誤は長かったが、出来てしまえば簡単だ・・・