在启动服务之前,在app.config中以编程方式修改连接字符串

时间:2012-02-11 14:10:53

标签: c# connection app-config

我在app.config文件中以编程方式更改连接字符串时遇到问题。 在重写OnStart方法时,我想更改app.config文件(仅限连接字符串) 此刻我有这个:

 private static void ChangeConnectionString(string newDatasource)
    {
        try
        {
            XDocument doc = XDocument.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
            var query = from p in doc.Descendants("connectionStrings").Descendants()
                         select p;
            foreach (var child in query)
            {
                foreach (var atr in child.Attributes())
                {
                    if (atr.Name.LocalName == "name" && atr.Value == "UniversityEntities" &&
                        atr.NextAttribute != null && atr.NextAttribute.Name == "connectionString")
                    {
                        SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder();
                        connectionStringBuilder.DataSource = newDatasource;
                        connectionStringBuilder.InitialCatalog = "UniversityDB";
                        connectionStringBuilder.IntegratedSecurity = true;

                        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(atr.NextAttribute.Value);
                        entityBuilder.ProviderConnectionString = connectionStringBuilder.ToString();
                        atr.NextAttribute.Value = entityBuilder.ToString();

                    }
                }

            }
            doc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
            ConfigurationManager.RefreshSection("connectionString");
        }
        catch (Exception x)
        {
        }
    }

2 个答案:

答案 0 :(得分:3)

不是更改连接字符串,而是在app.config文件中添加多个连接字符串,并根据需要在代码中使用它们。

这是一个例子:

//In app.config there are two connection string entry.
<connectionStrings>
<add name="BASE_ConnectionString" connectionString="Data Source=;Initial Catalog=;USER ID=;Password="
  providerName="System.Data.SqlClient" />
  <add name="" connectionString="server=;User Id=;database=;password="
  providerName="MySql.Data.MySqlClient"/> 
</connectionStrings>

您可以在运行时间之间通过以下方式在这两个条目之间切换:

string strTesaConnectionString = ConfigurationManager.ConnectionStrings["TESA_ConnectionString"].ConnectionString;
string strBaseConnectionString = ConfigurationManager.ConnectionStrings["BASE_ConnectionString"].ConnectionString;
if(1)
{
  using (MySqlConnection DBConnection = new MySqlConnection(strTesaConnectionString))
   { ... }
}
if(2)
{
  using (MySqlConnection DBConnection = new MySqlConnection(strBaseConnectionString ))
   { ... }
}

答案 1 :(得分:1)

如果要创建用于修改配置的UI,则可以执行此操作。但它不会在应用程序本身内发生。

首先你有受影响的服务/应用程序。 2,你有另一个应用程序将更改文件。

当管理员点击第二个应用程序中的“更改连接字符串”时,第二个应用程序将停止第一个服务/应用程序。更改连接字符串。启动第一个服务/应用程序。

所以从第一个应用程序的角度来看,它不必考虑将连接字符串混合在一起。

--------------------------------------

另一种方法是完全删除配置文件的连接字符串,并在应用程序启动时简单地使连接字符串成为必需参数。所以,如果它是服务器,它可能看起来像这样

net start [服务名称]“连接字符串......”

从第二个UI中,您可以覆盖启动/停止服务的bat / ps脚本。这样你就不必破解app.config文件的xml。

--------------------------------------

最后一条评论。删除try / catch,它完全没用,你需要知道更改文件时是否有问题。