C# 从外部配置文件读取连接字符串

C# 从外部配置文件读取连接字符串,c#,connection-string,app-config,external,configuration-files,C#,Connection String,App Config,External,Configuration Files,我已经创建了一个控制台应用程序、app.config文件和Connections.config文件。 app.config文件具有指向Connections.config的connectionstring属性源 当我试图读取应用程序中的连接字符串时,我得到一个ConfigurationErrorException 这是我的主要方法 static void Main(string[] args) { var settings = ConfigurationManager.C

我已经创建了一个控制台应用程序、app.config文件和Connections.config文件。 app.config文件具有指向Connections.config的connectionstring属性源

当我试图读取应用程序中的连接字符串时,我得到一个
ConfigurationErrorException

这是我的主要方法

static void Main(string[] args)
    {
        var settings = ConfigurationManager.ConnectionStrings;
        if (settings != null)
        {
            foreach (ConnectionStringSettings setting in settings)
            {
                Console.WriteLine(setting.ConnectionString);
            }
        }
    }
App.config文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings configSource="Connections.config"></connectionStrings>
</configuration>
<?xml version="1.0" encoding="utf-8" ?>
<connectionStrings>
  <add name="SQLDBConnecion"
   providerName="System.Data.ProviderName"
   connectionString="" />
</connectionStrings>
它返回的第二个连接字符串是空字符串(这是预期的)

我想像在我的场景中一样从外部文件读取连接字符串。怎么做?我在这里错过了什么

不要包含任何其他元素、节或属性

您需要删除XML编码

编辑

此外,您需要将配置文件的属性设置为
Copy to Output Directory=Copy if newer
Copy always

编辑2

为了建立Dave所说的,您将
clear
元素添加到外部文件中。您的最终
Connections.config
文件应如下所示:

<connectionStrings>
  <clear/>
  <add name="Name"
     providerName="System.Data.ProviderName"
     connectionString="Valid Connection String;" />
</connectionStrings>

您的Connections.config文件应如下所示,不带xml头

<connectionStrings>
  <add name="SQLDBConnecion"
   providerName="System.Data.ProviderName"
   connectionString="" />
</connectionStrings>


此外,为了在控制台应用程序中正确定位文件,请将“复制到输出目录”设置为“始终复制”或“复制(如果更新)。

您获得的第一个连接字符串是从machine.config继承的。MSDN文档中对此进行了描述

您可以使用配置文件中的Clear标记删除继承的连接字符串。


有一篇关于MSDN的好文章:

文章引述:

要在外部配置文件中存储连接字符串,请创建 仅包含ConnectionString部分的单独文件。做 不包括任何其他元素、节或属性。这 示例显示了外部配置文件的语法



希望这对以后遇到此问题的人有所帮助。

生成操作不是强制性的,如果将“复制到输出目录”设置为“始终复制”,或将“复制”设置为“更新”,则生成操作默认为“内容”。否则回答得很好-+1xml头没有任何区别。设置副本总能解决问题。非常感谢。
<connectionStrings>
  <add name="SQLDBConnecion"
   providerName="System.Data.ProviderName"
   connectionString="" />
</connectionStrings>
<connectionStrings>
  <clear/>
  <add name="SQLDBConnecion"
   providerName="System.Data.ProviderName"
   connectionString="" />
</connectionStrings>
<connectionStrings>
  <add name="Name" 
   providerName="System.Data.ProviderName" 
   connectionString="Valid Connection String;" />
</connectionStrings>