在运行时App.Config添加ConnectionString并显示而不重新加载应用程序?

时间:2009-12-14 11:24:44

标签: c# winforms

我们有一个内部工具,我们需要能够以编程方式添加连接字符串,然后重新加载此连接字符串,而无需重新加载应用程序。

我有点困惑,浪费了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 个答案:

答案 0 :(得分:4)

如何使用以下代码片段之类的反射方法:

        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;

答案 1 :(得分:0)

为什么不将连接字符串加载到静态变量中。你可以初始化 app.config中带有连接字符串的变量。然后,您可以在运行时轻松更改变量。

您可以让应用程序在关闭时将静态变量保存到app.config。

答案 2 :(得分:0)

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

这对我有用......

  

在进行一些挖掘之后,我发现以下代码放在Settings.cs中[转到设置,然后单击"查看代码"]。

然后覆盖Item属性。