Изменение строки подключения и перезагрузка 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);
Ответы
Ответ 1
Придется делать точные вещи. Это код, который работал у меня:
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");
Ответ 2
IIRC, ConfigurationManager.RefreshSection требует строковый параметр, определяющий имя раздела для обновления:
ConfigurationManager.RefreshSection("connectionStrings");
Я думаю, что приложение ASP.NET должно автоматически перезагружаться при изменении элемента ConnectionStrings и не нужно перезагружать конфигурацию вручную.
Ответ 3
//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.
Ответ 4
Вы также можете полностью обновить конфигурацию:
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();
Ответ 5
Да, когда обновляется ASP.NET web.config, все приложение перезапускается, что означает перезагрузку web.config.
Ответ 6
Сначала вы можете добавить
using System.Configuration;
В файл .cs. Если он недоступен, добавьте его в Project References, поскольку он не включен по умолчанию в новый проект.
Это мое решение этой проблемы.
Сначала я создал класс ConnectionProperties, который сохраняет элементы, которые мне нужно изменить в исходной строке подключения.
Переменная _name в классе 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;
/// <summary>
/// Basic Connection Properties constructor
/// </summary>
public ConnectionProperties()
{
}
/// <summary>
/// Constructor with the needed settings
/// </summary>
/// <param name="name">The name identifier of the connection</param>
/// <param name="dataSource">The url where we connect</param>
/// <param name="username">Username for connection</param>
/// <param name="password">Password for connection</param>
/// <param name="initCat">Initial catalogue</param>
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
}
Ответ 7
//вот как это сделать в 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;
}