我在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)
{
}
}
答案 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,它完全没用,你需要知道更改文件时是否有问题。