Добавление ConnectionString во время выполнения App.Config и отображение без перезагрузки приложения? - PullRequest
2 голосов
/ 14 декабря 2009

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

Я немного растерялся и потратил 2 дня на это и собираюсь сдаться. Я сделал следующее

       var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        int initialCount = ConfigurationManager.ConnectionStrings.Count;
        string connStringName = "TEST";
        string serverName="Servedr";
        string databaseName = "MyDb";
        string userId="MyUseId";
        string password="MyPassword";
        var connectionStringBuilder = new SqlConnectionStringBuilder
                                          {
                                              DataSource = serverName,
                                              InitialCatalog = databaseName,
                                              UserID = userId,
                                              Password = password
                                          };


        var csSetting = new ConnectionStringSettings(connStringName, connectionStringBuilder.ConnectionString, "System.Data.SqlClient");
        var csSection = config.ConnectionStrings;
        csSection.ConnectionStrings.Add(csSetting);
        config.Save(ConfigurationSaveMode.Modified, true);
        ConfigurationManager.RefreshSection("ConnectionStrings");

        int finalCount = ConfigurationManager.ConnectionStrings.Count;

Это должно работать, нет? RefreshSection и т.д ... Какие-либо предложения? обходные пути без перезапуска?

Спасибо

Ответы [ 3 ]

4 голосов
/ 18 января 2010

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

        var csSetting = new ConnectionStringSettings(connStringName, connectionStringBuilder.ConnectionString, "System.Data.SqlClient");

        var readonlyField = typeof(ConfigurationElementCollection).GetField("bReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
        readonlyField.SetValue(ConfigurationManager.ConnectionStrings, false);

        var baseAddMethod = typeof(ConfigurationElementCollection).GetMethod("BaseAdd",
            BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(ConfigurationElement) }, null);
        baseAddMethod.Invoke(ConfigurationManager.ConnectionStrings, new object[] { csSetting });

        readonlyField.SetValue(ConfigurationManager.ConnectionStrings, true);

        int finalCount = ConfigurationManager.ConnectionStrings.Count;
0 голосов
/ 30 июня 2015

http://www.csharpbydesign.com/2008/01/overriding-dataset-settings-co.html

Это сработало для меня ...

После некоторого копания я нашел следующий код для установки в Settings.cs [Перейти к настройкам, затем нажмите «Просмотреть код»].

Затем переопределите свойство Item.

0 голосов
/ 14 декабря 2009

Почему бы не загрузить строку подключения в статическую переменную. Вы можете инициализировать переменная со строкой соединения в app.config. Вы можете легко изменить переменную во время выполнения.

Ваше приложение может сохранить статическую переменную в app.config при ее закрытии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...