Измените строку подключения и перезагрузите 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);

person Community    schedule 02.02.2009    source источник
comment
Пожалуйста, правильно отформатируйте фрагмент кода. Сейчас очень тяжело читать.   -  person Cerebrus    schedule 02.02.2009


Ответы (8)


Пришлось сделать именно это. Это код, который работал для меня:

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");
person Bradley Mountford    schedule 09.01.2012
comment
@Bradley: я пытаюсь сделать то же самое, но у меня возникают проблемы с правами UAC ... потому что app.config находится в файлах программ. Есть ли способ изменить местоположение app.config. Я пробовал AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\app.config"); в Main(), но это сработало. - person prasy; 16.01.2015
comment
@Bradley Это вызывает для меня исключение NullReferenceException, поэтому я изменил его на config.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings()), но остальной код работает. Спасибо! - person knguyen; 22.04.2015
comment
@knguyen Похоже, у вас либо не было раздела конфигурации с именем connectionStrings, либо не была определена строка подключения в этом разделе с именем, которое вы указали в строке 3 (которую я назвал Бла) примера. - person Bradley Mountford; 27.04.2015
comment
На самом деле, я только что проверил, и это действительно меняет файл на диске для меня. - person Josh; 13.01.2017
comment
docs.microsoft.com/en-ca/dotnet/ api/ действительно подтверждает, что файл конфигурации обновлен, вызывая метод save - person jmlane; 18.12.2017
comment
у меня это не работало, после этого изменения у меня заработало OpenExeConfiguration(Application.ExecutablePath) Примечание: чтобы увидеть эффект, откройте файл your_app_name.exe.config с помощью блокнота. - person sairfan; 05.06.2018

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

ConfigurationManager.RefreshSection("connectionStrings");

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

person Cerebrus    schedule 02.02.2009

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

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();
person Neil Barnwell    schedule 02.02.2009
comment
Привет, Нил, не могли бы вы расширить свой ответ? Я нуб. Как установить currentConfiguration и importFromConnectionString? - person robnardo; 03.07.2009
comment
@neil-barnwell: доработайте реализацию строки Properties.Settings.Default.Reload(); . Сейчас это слишком загадочно, чтобы понять - person Sudhanshu Mishra; 11.07.2012
comment
@mishrsud Ну, он делает то, что говорит - загружает в память настройки, которые вы только что сохранили в файл. - person Neil Barnwell; 11.07.2012

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

person ajma    schedule 02.02.2009

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

using System.Configuration;

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

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

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
}
person Athanasios Kataras    schedule 25.02.2013

//вот как это сделать в 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;
    }
person Joselo    schedule 04.06.2013

Вот метод, который я использую:

public void AddOrUpdateAppConnectionStrings(string key, string value)
{
    try
    {
        var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var settings = configFile.ConnectionStrings.ConnectionStrings;
        if (settings[key] == null)
        {
            settings.Add(new ConnectionStringSettings(key,value));
        }
        else
        {
            settings[key].ConnectionString = value;
        }
        configFile.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection(configFile.ConnectionStrings.SectionInformation.Name);
        Properties.Settings.Default.Reload();
    }
    catch (ConfigurationErrorsException)
    {
        Console.WriteLine("Error writing app settings");
    }
}
person joacho61    schedule 22.10.2020

person    schedule
comment
Что такое класс свойств? - person Anthony Brenelière; 20.12.2017