как динамически изменить строку подключения в web.config

#c# #web-config

#c# #web-config

Вопрос:

Я определяю строку подключения в web.config

      <ConnectionStrings>
 <add name="student" connectionString="Server=student;Max Pool Size=300;Initial Catalog=studentDB;User ID=student;Password=st123dent;" providerName="System.Data.SqlClient"/>
     </Connectionstrings>
  

как я могу динамически изменять строку подключения в c#

Комментарии:

1. вы хотите изменить строку подключения, которую используете на странице, или вы хотите изменить строку подключения в файле web.config?

2. Каков контекст использования? Я подозреваю, что вы можете захотеть использовать ASP.Net Членство . Прошу прощения, если я ошибаюсь.

3. измените строку подключения в web.config

4. мой applicatin используется разными сетями, у каждого из которых есть своя БД, когда пользователь входит в систему в зависимости от своего доменного имени, адреса порта, мы извлекаем строку соединения из БД (около 250 строк подключения), которая используется для подключения к DB.is это хороший способ ? или любая другая лучшая практика?

Ответ №1:

Конфигурация доступна только для чтения, поэтому вы не можете сделать это очевидным образом, например

 ConfigurationManager.ConnectionStrings["student"].ConnectionString = "new value";
  

Это поднимает систему.Конфигурация.Исключение ConfigurationErrorsException, в котором говорится, что «Конфигурация доступна только для чтения».

Вот трюк, использующий отражение для сброса атрибута только для чтения элемента конфигурации. Смотрите Эту статью для получения полной информации о программной настройке свойства ConnectionString

Фрагмент кода:

 var settings = ConfigurationManager.ConnectionStrings[ 0 ];
var fi = typeof(ConfigurationElement).GetField(
              "_bReadOnly", 
              BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(settings, false);
settings.ConnectionString = "Data Source=Something";
  

Кстати, зачем вам нужно менять конфигурацию? Я чувствую, что вы пытаетесь решить какую-то проблему неправильным способом.

Комментарии:

1. мой applicatin используется разными сетями, у каждого из которых есть своя БД, когда пользователь входит в систему в зависимости от своего доменного имени, адреса порта, мы извлекаем строку соединения из БД (около 250 строк подключения), которая используется для подключения к DB.is это хороший способ ? или любая другая лучшая практика?

Ответ №2:

Вы можете открыть свой файл Web.Config для чтения и записи с помощью WebConfigurationManager.OpenWebConfiguration или WebConfigurationManager.OpenMappedWebConfiguration . И при условии, что у вас есть разрешение на запись, вы сможете вносить изменения, такие как изменение строки подключения.

Это, безусловно, должно быть лучше, чем использовать отражение для изменения частного поля.

Изменение web.config приведет к перезапуску веб-приложения, поэтому это не подходит для того, чтобы позволить пользователям вносить изменения в web.config, хотя его можно использовать в определенных сценариях, таких как развертывание.

Пример:

 var configurationFileInfo = new FileInfo(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
var vdm = new VirtualDirectoryMapping(configurationFileInfo.DirectoryName, true, configurationFileInfo.Name);
var wcfm = new WebConfigurationFileMap();
wcfm.VirtualDirectories.Add("/", vdm);
Configuration config = WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");

ConnectionStringsSection section = config.GetSection("connectionStrings") 
                         as ConnectionStringsSection;
if (section != null)
{
    ... modify the section ...
    config.Save();
}
  

Комментарии:

1. как это изменить .. я использовал раздел . Connectionstring= «источник данных», это выдает ошибку

2. @Gani, что-то вроде section.ConnectionStrings["MyName"].ConnectionString = "..." .

Ответ №3:

в веб-конфигурации поместите этот код

 <add name="yourconnectionname" connectionString="Data Source={0};Initial Catalog={1};User ID={2};Password={3}" providerName="System.Data.SqlClient"/>
  

в вашем соединении поместите этот код

  string ScrtCon = ConfigurationManager.ConnectionStrings["yourconnectionname"].ToString();
ScrtCon = string.Format(ScrtCon, "Server Name","Data base Name",  "Database User Name", "Database password");
  

Ответ №4:

Если пользователь может изменить значение параметра, то файл web.config является неправильным местом для хранения параметра.

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

MSDN — использование настроек в C

При использовании подобных настроек легко изменить значение во время выполнения:

 Properties.Settings.Default.ConnectionStringName = "New Connection String";
Properties.Settings.Default.Save();
  

Ответ №5:

Использовать пространство имен

 using System.Configuration;
using System.Web.Configuration;


void ConfigurnewConnectionString(string server, string database, string userid, string password)
    {


    string str = "server="   server   ";database="   database   "; User ID="   userid   "; Password="   password   "";
    //Configuration myConfiguration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
    //str = System.Web.Configuration.WebConfigurationManager.AppSettings["myKey"];
    //myConfiguration.Save();
    System.Configuration.Configuration Config1 = WebConfigurationManager.OpenWebConfiguration("~");
    ConnectionStringsSection conSetting = (ConnectionStringsSection)Config1.GetSection("connectionStrings");
    ConnectionStringSettings StringSettings = new ConnectionStringSettings("conn", "Data Source="   server   ";Database="   database   ";User ID="   userid   ";Password="   password   ";");
    conSetting.ConnectionStrings.Remove(StringSettings);
    conSetting.ConnectionStrings.Add(StringSettings);
    Config1.Save(ConfigurationSaveMode.Modified);
    //Configuration myConfiguration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
    //myConfiguration.AppSettings.Settings.Item("myKey").Value = txtmyKey.Text;
    //myConfiguration.Save();
}