【问题标题】:Change connection string & reload app.config at run time在运行时更改连接字符串并重新加载 app.config
【发布时间】:2010-10-04 21:11:44
【问题描述】:

当我使用此代码更改连接字符串时,它不会在运行时重新加载 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);

【问题讨论】:

  • 请正确重新格式化您的代码 sn-p。现在很难阅读。

标签: c# configuration


【解决方案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");

【讨论】:

  • @Bradley:我正在尝试做同样的事情,但我遇到了 UAC 权限问题......因为 app.config 在程序文件中。有没有办法可以更改 app.config 的位置。我在Main() 中尝试过AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\app.config");,但它确实有效。
  • @Bradley 这会为我抛出 NullReferenceException,所以我将其更改为 config.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings()),但其余代码有效。谢谢!
  • @knguyen 听起来您要么没有名为“connectionStrings”的配置部分,要么没有在该部分中使用您在第 3 行中指定的名称定义连接字符串(我将其命名为“Blah” ) 的例子。
  • 实际上,我刚刚测试过,这确实为我更改了磁盘文件。
  • docs.microsoft.com/en-ca/dotnet/api/… 确实通过调用save 方法确认配置文件已更新
【解决方案2】:

IIRC,ConfigurationManager.RefreshSection 需要一个字符串参数来指定要刷新的部分的名称:

ConfigurationManager.RefreshSection("connectionStrings");

我认为,当 ConnectionStrings 元素被修改时,ASP.NET 应用程序应该会自动重新加载,并且不需要手动重新加载配置。

【讨论】:

    【解决方案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】:

    是的,当 ASP.NET web.config 更新时,整个应用程序会重新启动,这意味着 web.config 会重新加载。

    【讨论】:

      【解决方案5】:

      您也可以整体刷新配置:

      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();
      

      【讨论】:

      • 嗨,尼尔,您能否扩展您的答案?我是菜鸟。如何设置 currentConfiguration 和 importFromConnectionString ?
      • @neil-barnwell:请详细说明“Properties.Settings.Default.Reload();”行的实现。现在它太神秘了,无法理解
      • @mishrsud 好吧,它会按照它说的去做 - 它将您刚刚保存到文件中的设置加载到内存中。
      【解决方案6】:

      首先你可能想添加

      using System.Configuration;
      

      到您的 .cs 文件。如果它不可用,请通过项目引用添加它,因为它默认不包含在新项目中。

      这是我对这个问题的解决方案。 首先,我创建了 ConnectionProperties 类,它将我需要更改的项目保存在原始连接字符串中。 ConnectionProperties 类中的 _name 变量作为 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;
            }
        

        【讨论】:

          【解决方案8】:

          这是我使用的方法:

          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");
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2012-04-30
            • 2012-07-23
            • 2017-11-17
            • 2019-02-27
            • 2017-08-18
            • 1970-01-01
            • 2011-09-14
            • 2019-04-02
            • 1970-01-01
            相关资源
            最近更新 更多