1

実行時に app.config/web.config で定義された接続文字列を変更することは可能ですか? アプリ/サイトが実行されているマシンに応じて異なる構成ファイルを使用したい (もちろん、デバッグ目的のみ。デプロイ時に通常の構成ファイルを使用します)。

AppSettings は記述できますが、ConnectionStrings (AFAIK) は記述できません。それともできますか?

4

4 に答える 4

2

はい、可能ですが、AFAIKはリフレクションを介してのみです。次のコードは、必要なことを行う必要があります (使用法については以下をお読みください)。

public static string SetConnectionString(Type assemblyMember,
                                         Type settingsClass,
                                         string newConnectionString,
                                         string connectionStringKey)
{
  Type typSettings = Type.GetType(Assembly.CreateQualifiedName(assemblyMember.Assembly.FullName, settingsClass.FullName));

  if (typSettings == null)
  {
    return null;
  }

  PropertyInfo prpDefault = typSettings.GetProperty("Default", BindingFlags.Static | BindingFlags.Public);

  if (prpDefault == null)
  {
    return null;
  }

  object objSettings = prpDefault.GetValue(null, null);

  if (objSettings == null)
  {
    return null;
  }

  // the default property, this[], is actually named Item
  PropertyInfo prpItem = objSettings.GetType().GetProperty("Item", BindingFlags.Instance | BindingFlags.Public);

  if (prpItem == null)
  {
    return null;
  }

  object[] indexerName = { connectionStringKey };
  string oldConnectionString = (string)prpItem.GetValue(objSettings, indexerName);

  prpItem.SetValue(objSettings, newConnectionString, indexerName);

  return oldConnectionString;
}

assemblyMember 呼び出しタイプ
settingsClass は設定クラスのタイプです設定
newConnectionStringする完全な文字列は
connectionStringKeyアプリの設定で定義した接続文字列の名前です

アプリが起動したらできるだけ早く、できれば Main() メソッドでこのメソッドを呼び出す必要があります。

于 2009-03-20T10:35:27.143 に答える
1

デバッグの目的でプロジェクトでこれを1回試しましたが、できませんでした。問題は、アプリの起動時にapp.configがメモリに読み込まれ、app.configに変更が加えられた場合に発生します。アプリの実行中は反映されません。

これを克服するには、これが私が行ったことです。app.configですべての接続文字列を定義してから、プログラムがこのように実行されているときに必要な接続文字列を呼び出します。

たとえば、app.configで接続文字列を次のように定義したとします。

<connectionStrings>
    <add name="YourNameSpace.Properties.Settings.ConnectionString_1"
        connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data  
        Source=|DataDirectory|\file.mdb"
        providerName="System.Data.OleDb"/>

    <add name="YourNameSpace.Properties.Settings.ConnectionString_2"
        connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data  
        Source=|DataDirectory|\file.mdb"
        providerName="System.Data.OleDb"/>

</connectionStrings>

必要な数だけ定義し(デバッグは正しく行われます:-))、コードでこれらの接続設定を呼び出すには、次のようにします。

YourNameSpace.Properties.Settings foo = new YourNameSapce.Properties.Settings();

foo.ConnectionString_1;

HTH

よろしくお願いします

@nand

PS:この返信はC#に固有のものです。

于 2009-03-20T09:31:59.807 に答える
1

実行中のプロセスの構成ファイルを実際に編集することはできません。

1 つのオプション (長所と短所があります) は、machine.config またはマスター web.config で構成データを使用することです (「サイト」の場合は「場所」ノードを使用します) - ただし、急いで使用するオプションではありません。

これを処理するより良い方法は、理想的には自動化された、ビルド/デプロイ プロセスの一部として構成ファイルを交換することです。そうすれば、すべてが自己完結型であり、バニラサーバーに「ロボコピー」して機能させることができます.


「開発者ごと」のポイントを確認してください。これを行う最も簡単な方法は、構成を標準化し、マシンを微調整することであることがわかりました。たとえば、VM でローカル Web サーバーを実行します。各マシンに対してコーディングするのではなく、「localserver」で標準化し (「localhost」をミラーリングするため)、開発者が制御できる各マシンにローカル DNS レコードを追加します。これには、時間の経過とともに変化するのを防ぐために、固定 IP アドレス (または DHCP 予約) が必要であることに注意してください!

同上データベース。ローカル サーバーは「.」を使用できます。リモートサーバーはマシン上でエイリアスできるため、「devserver」はユーザーが望むものを指します。

ちょっとした考え...

于 2009-03-20T09:22:08.987 に答える
0

Web サイトをインストールするときに、NAnt スクリプトで xmlpoke を実行できます。

例えば

  1. Web サイトで NAnt をデプロイします。
  2. サイトをインストールする NAnt を呼び出す go.bat を作成し、xmlpoke を実行して、サーバー名またはその他のパラメーターに基づく設定で web.config を変更します。
于 2009-03-20T09:53:29.410 に答える