Изменение строки подключения и перезагрузка app.config во время выполнения

Когда я меняю строку соединения с помощью этого кода, она не перезагружает app.config во время выполнения. Я ожидал, что он будет перезагружаться аналогично тому, как мы перезагружаем app.config .

 config.ConnectionStrings.ConnectionStrings["JVVNL_NEW.Properties.Settings.JVVNL_NEWConnectionString1"].ConnectionString = ConString; config.ConnectionStrings.ConnectionStrings["CMS_NEW.Properties.Settings.JVVNL_NEWConnectionString1"].ConnectionString = ConString; config.Save(ConfigurationSaveMode.Modified,true); ConfigurationManager.RefreshSection(config.ConnectionStrings.SectionInformation.SectionName); 

Должен был сделать это точно. Это код, который работал для меня:

 var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings"); connectionStringsSection.ConnectionStrings["Blah"].ConnectionString = "Data Source=blah;Initial Catalog=blah;UID=blah;password=blah"; config.Save(); ConfigurationManager.RefreshSection("connectionStrings"); 

IIRC, ConfigurationManager.RefreshSection требует строковый параметр, определяющий имя раздела для обновления:

 ConfigurationManager.RefreshSection("connectionStrings"); 

Я думаю, что приложение ASP.NET должно автоматически перезагружаться при изменении элемента ConnectionStrings и не нужно вручную перезагружать конфигурацию.

 //You can apply the logic in "Program.cs" //Logic for getting new connection string //**** // MyDBName="mydb"; // //**** //Assign new connection string to a variable string newCnnStr = a="Data Source=.\SQLExpress;Initial Catalog=" + MyDBName + ";Persist Security Info=True;User ID=sa;Password=mypwd"; //And Finally replace the value of setting Properties.Settings.Default["Nameof_ConnectionString_inSettingFile"] = newCnnStr; //This method replaces the value at run time and also don't needs app.config for the same setting. It will have the va;ue till the application runs. //It worked for me. 

Вы также можете обновить конфигурацию в полном объеме:

 ConnectionStringSettings importToConnectionString = currentConfiguration.ConnectionStrings.ConnectionStrings[newName]; if (importToConnectionString == null) { importToConnectionString = new ConnectionStringSettings(); importToConnectionString.ConnectionString = importFromConnectionString.ConnectionString; importToConnectionString.ProviderName = importFromConnectionString.ProviderName; importToConnectionString.Name = newName; currentConfiguration.ConnectionStrings.ConnectionStrings.Add(importToConnectionString); } else { importToConnectionString.ConnectionString = importFromConnectionString.ConnectionString; importToConnectionString.ProviderName = importFromConnectionString.ProviderName; } Properties.Settings.Default.Reload(); 

Да, когда ASP.NET web.config обновляется, все приложение перезапускается, что означает, что web.config перезагружается.

Сначала вы можете добавить

 using System.Configuration; 

В файл .cs. Если он недоступен, добавьте его в Project References, поскольку он не включен по умолчанию в новый проект.

Это мое решение этой проблемы. Сначала я создал class ConnectionProperties, который сохраняет элементы, которые мне нужно изменить в исходной строке подключения. Переменная _name в classе ConnectionProperties важна как имя connectionString. Первый метод принимает строку соединения и изменяет нужный параметр с новым значением.

 private String changeConnStringItem(string connString,string option, string value) { String[] conItems = connString.Split(';'); String result = ""; foreach (String item in conItems) { if (item.StartsWith(option)) { result += option + "=" + value + ";"; } else { result += item + ";"; } } return result; } 

Вы можете изменить этот метод, чтобы удовлетворить ваши собственные потребности. У меня есть оба соединения mysql и mssql, поэтому мне нужны были оба. Конечно, вы можете уточнить этот код проекта для себя.

 private void changeConnectionSettings(ConnectionProperties cp) { var cnSection = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); String connString = cnSection.ConnectionStrings.ConnectionStrings[cp.Name].ConnectionString; connString = changeConnStringItem(connString, "provider connection string=\"data source", cp.DataSource); connString = changeConnStringItem(connString, "provider connection string=\"server", cp.DataSource); connString = changeConnStringItem(connString, "user id", cp.Username); connString = changeConnStringItem(connString, "password", cp.Password); connString = changeConnStringItem(connString, "initial catalog", cp.InitCatalogue); connString = changeConnStringItem(connString, "database", cp.InitCatalogue); cnSection.ConnectionStrings.ConnectionStrings[cp.Name].ConnectionString = connString; cnSection.Save(); ConfigurationManager.RefreshSection("connectionStrings"); } 

Поскольку я не хотел добавлять тривиальную информацию, я пропустил область свойств моего кода. Пожалуйста, добавьте его, если вы хотите, чтобы это сработало.

 class ConnectionProperties { private String _name; private String _dataSource; private String _username; private String _password; private String _initCatalogue; ///  /// Basic Connection Properties constructor ///  public ConnectionProperties() { } ///  /// Constructor with the needed settings ///  /// The name identifier of the connection /// The url where we connect /// Username for connection /// Password for connection /// Initial catalogue public ConnectionProperties(String name,String dataSource, String username, String password, String initCat) { _name = name; _dataSource = dataSource; _username = username; _password = password; _initCatalogue = initCat; } // Enter corresponding Properties here for access to private variables } 

// вот как это сделать в Windows App.Config

 public static bool ChangeConnectionString(string Name, string value, string providerName, string AppName) { bool retVal = false; try { string FILE_NAME = string.Concat(Application.StartupPath, "\\", AppName.Trim(), ".exe.Config"); //the application configuration file name XmlTextReader reader = new XmlTextReader(FILE_NAME); XmlDocument doc = new XmlDocument(); doc.Load(reader); reader.Close(); string nodeRoute = string.Concat("connectionStrings/add"); XmlNode cnnStr = null; XmlElement root = doc.DocumentElement; XmlNodeList Settings = root.SelectNodes(nodeRoute); for (int i = 0; i < Settings.Count; i++) { cnnStr = Settings[i]; if (cnnStr.Attributes["name"].Value.Equals(Name)) break; cnnStr = null; } cnnStr.Attributes["connectionString"].Value = value; cnnStr.Attributes["providerName"].Value = providerName; doc.Save(FILE_NAME); retVal = true; } catch (Exception ex) { retVal = false; //Handle the Exception as you like } return retVal; } 
  • Как добавить class фильтра в Spring Boot?
  • Struts 2: для пространства имен не отображается действие
  • Конфигурация .NET (app.config / web.config / settings.settings)
  • Как определить настраиваемые переменные конфигурации в рельсах
  • конфигурация страtagsи именования spring - hibernate 5
  • Что я должен установить JAVA_HOME на OSX
  • Данный URL-адрес не разрешен конфигурацией приложения
  • Как изменить имя машины по умолчанию «по умолчанию»?
  • Включить удаленные подключения tcp \ ip к серверу sql. Экспресс уже установленная firebase database с кодом или скриптом (запрос)
  • Как импортировать Java-config-class в XML-config, чтобы оба контекста имели компоненты?
  • Как использовать общие свойства для нескольких проектов maven?
  • Давайте будем гением компьютера.