在运行时更改连接字符串

本文关键字:连接 字符串 运行时 | 更新日期: 2023-09-27 17:54:34

我有一个app.config文件,它有一个连接字符串为我的数据库。我想要做的是连接到不同的数据库这就是为什么我习惯使用这个代码:

 connectionString = "Data Source=blah;Initial Catalog=blah;UID=blah;password=blah";
        var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
        connectionStringsSection.ConnectionStrings[nameofConnectionString].ConnectionString = connectionString;
        config.Save();
        ConfigurationManager.RefreshSection(nameofConnectionString);

它工作得很好,它改变了连接字符串,但问题是它给我一个错误说"facerec6.0"。不存在"

my default initial catalog = facerec6.0

我该怎么办?

在运行时更改连接字符串

ConnectionStringSection只是一个存储命名连接字符串的容器。如果你想连接到不同的数据库,那么最好从一开始就将这些不同的连接字符串存储在该部分中,然后决定你的应用程序将如何在运行时选择使用哪一个。

就把这个部分想成这样,仅此而已——它是一个方便的、已知的地方,用于存储连接字符串,并提供标准的检索方式。处理代码的其他开发人员将知道在哪里查找它们并知道如何检索它们。

即使在技术上可以在运行时修改该部分并保存文件,我也不会这样做。如果你有相同的代码,可能会使用不同的连接字符串,而在相同的环境中运行(这不是一个用于开发,一个用于QA,一个用于生产的情况),那么你可以让你的类依赖于这样的接口:

public interface IConnectionStringFactory
{
    string GetConnectionString(Something key);
}

其中Something是需要连接字符串的类可以传递给工厂的值,工厂可以使用它来确定检索哪个连接字符串。这样,使用连接字符串的类就与该逻辑隔离了。它不知道为什么使用一个或另一个连接字符串。它只是从工厂获取一个连接字符串,然后使用它。

如果它是一个根据环境变化连接字符串的情况,那么这就容易得多了——你可以用配置转换来做到这一点。在大多数情况下,如果它是一个不同的环境,那么所有的连接字符串对于每个环境都是不同的,所以你可以只替换整个部分。

<connectionStrings xdt:Transform="Replace">
    <add name="connectionStringA" connectionString="...whatever..." />
</connectionStrings>

请试试这个:

ConfigurationManager.RefreshSection("connectionStrings");

因为:

<connectionStrings> <- this is the section
   <add name="facerec6.0"/> <- this is the element
   <add ... />
</connectionStrings>

使用RefreshSection时,需要刷新的是section,而不是元素。