【问题标题】:Adding ConnectionString at runtime App.Config and display without reloading application?在运行时 App.Config 中添加 ConnectionString 并在不重新加载应用程序的情况下显示?
【发布时间】:2015-06-30 20:42:57
【问题描述】:

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

我有点困惑和浪费了 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;

这应该可以吗?刷新部分等... 有什么建议么? 无需重新启动的解决方法?

谢谢

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    如何使用反射方法,如以下代码 sn-ps:

            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;
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        这对我有用...

        经过一番挖掘后,我发现以下代码放置在 Settings.cs [转到设置,然后单击“查看代码”]。

        然后覆盖 Item 属性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-14
          • 2017-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-15
          相关资源
          最近更新 更多