Можно ли изменить конфигурацию ConnectionStrings во время выполнения? - PullRequest
1 голос
/ 20 марта 2009

Можно ли изменить строки подключения, определенные в app.config / web.config во время выполнения? Я хочу использовать разные конфигурационные файлы в зависимости от компьютера, на котором запущено приложение / сайт (конечно, только для отладки. Мы будем использовать обычные конфигурационные файлы при развертывании).

Я могу написать AppSettings, но не ConnectionStrings (AFAIK). Или я могу?

Ответы [ 5 ]

2 голосов
/ 20 марта 2009

Да, это возможно, но AFAIK только через Reflection. Следующий код должен делать то, что вам нужно (читайте ниже для использования):

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 ().

1 голос
/ 20 марта 2009

Я пытался сделать это один раз в своем проекте с целью отладки, но не смог этого сделать, проблема (я думаю, исправьте меня, если я ошибаюсь) заключается в запуске приложения 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;

НТН

С наилучшими пожеланиями

@ * 1018 NAND *

P.S .: Этот ответ относится только к C #.

0 голосов
/ 20 марта 2009

Вы можете запустить xmlpoke в сценарии NAnt при установке сайта.

* 1003 Е.Г. *

  1. Разверните NAnt с помощью веб-сайта.
  2. Создайте go.bat, который вызывает NAnt, который устанавливает сайт и выполняет xmlpoke для изменения web.config с настройками, основанными на имени сервера или каком-либо другом параметре.
0 голосов
/ 20 марта 2009

В этой статье подробно рассматриваются имеющиеся у вас опции: http://aspalliance.com/820

0 голосов
/ 20 марта 2009

Вы не можете редактировать файл конфигурации запущенного процесса.

Один из вариантов (с плюсами и минусами) - использовать данные конфигурации в machine.config или в главном web.config (для «сайта» вы используете узлы «location») - не вариант спешить, хотя .

Лучший способ справиться с этим - поменять конфигурационный файл как часть вашего процесса сборки / развертывания, в идеале автоматизированного. Таким образом, все будет автономно, и вы сможете «робокопировать» на ванильный сервер и заставить его работать.


Re ваше очко "за разработчика"; Я обнаружил, что самый простой способ сделать это - стандартизировать конфигурацию и настроить машины. Например, мы запускаем локальный веб-сервер на виртуальной машине; вместо того, чтобы кодировать каждую машину, мы стандартизируем «localserver» (чтобы отразить «localhost») и добавляем локальную запись DNS для каждой машины, которой может управлять разработчик. Обратите внимание, что для этого требуется фиксированный IP-адрес (или, возможно, резервирование DHCP), чтобы предотвратить его изменение со временем!

То же базы данных; локальные серверы могут использовать "."; удаленные серверы могут иметь псевдонимы на компьютере, поэтому «devserver» указывает на то, что хочет пользователь.

Просто мысль ...

...