我有一个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.cdcol不存在"
我的默认初始目录= facerec6.0
我会怎么做?
答案 0 :(得分:0)
请改为尝试:
ConfigurationManager.RefreshSection("connectionStrings");
,因为:
<connectionStrings> <- this is the section
<add name="facerec6.0"/> <- this is the element
<add ... />
</connectionStrings>
使用RefreshSection
时,您需要刷新部分,而不是元素。
答案 1 :(得分:0)
ConnectionStringSection
只是一个存储命名连接字符串的容器。如果要连接到不同的数据库,那么最好从一开始就将那些不同的连接字符串存储在该部分中,然后确定应用程序将如何选择在运行时使用哪一个。
将该部分视为仅此而已,仅此而已 - 它是一个方便的,已知的存储连接字符串的地方,以及检索它们的标准方法。其他开发代码的开发人员将知道在哪里查找它们并知道如何检索它们。
即使技术上可以在运行时修改该部分并保存文件,但我不会这样做。如果你有相同的代码,可以在同一个环境中运行时使用不同的连接字符串(不是一个用于开发,一个用于QA,一个用于生产),那么你可以让你的类依赖于这样的接口:
public interface IConnectionStringFactory
{
string GetConnectionString(Something key);
}
其中Something
是需要连接字符串的类可以传递给工厂的值,并且工厂可以使用它来确定要检索的连接字符串。这样,使用连接字符串的类与该逻辑绝缘。它不知道为什么它使用一个或另一个连接字符串。它只是从工厂获取一个连接字符串,然后使用它。
如果是环境变化的连接字符串的情况,则更容易 - 您可以使用config transforms执行此操作。在大多数情况下,如果它是一个不同的环境,那么 all 连接字符串对于每个环境都是不同的,所以你可以只替换整个部分。
<connectionStrings xdt:Transform="Replace">
<add name="connectionStringA" connectionString="...whatever..." />
</connectionStrings>