Чтение строки подключения из внешнего файла конфигурации

Я создал консольное приложение и файл app.config и файл Connections.config. Файл app.config имеет источник свойства connectionstring, указывающий на Connections.config

Когда я попытался прочитать строку подключения в приложении, я получаю 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>

Файл Connections.config

<?xml version="1.0" encoding="utf-8" ?>
<connectionStrings>
  <add name="SQLDBConnecion"
   providerName="System.Data.ProviderName"
   connectionString="" />
</connectionStrings>

Здесь я заметил две вещи. Во-первых: если я укажу configSource, я не могу прочитать строку соединения (исключение throwing).

Во-вторых: если я помещаю ту же строку соединения в файл App.config и пытаюсь прочитать, тогда код работает, но получает две строки подключения (которая должна быть возвращена только той, которая является пустой строкой) Первая строка соединения - это строка соединения sqlexpress, подобная этой

data source=.\SQLEXPRESS;Integrated Security=SSPI;
     AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true

вторая строка подключения, возвращающая пустую строку (это ожидается).

Я хочу прочитать строку подключения из внешнего файла, как в моем сценарии. Как это сделать? Что мне здесь не хватает?

Ответ 1

MSDN говорит:

Не включайте дополнительные элементы, разделы или атрибуты.

Вам нужно удалить XML-кодировку.

Edit

Кроме того, вам нужно установить свойства вашего файла конфигурации на Copy to Output Directory = Copy if newer или Copy always.

enter image description here

Изменить 2

Чтобы опираться на то, что сказал Дэйв, вы добавляете элемент clear во внешний файл. Ваш окончательный файл Connections.config должен выглядеть так:

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

Ответ 2

Ваш файл Connections.config должен быть таким, как показано ниже, без заголовка xml

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

Чтобы правильно найти файл в консольном приложении, установите Копировать в каталог выпуска, чтобы копировать всегда или копировать, если новый.

Ответ 3

Эта первая строка соединения, которую вы получаете, наследуется от machine.config. Это описано в документации MSDN. http://msdn.microsoft.com/en-us/library/bf7sd233(v=vs.90).aspx

Вы можете использовать тег "Очистить" в вашем файле конфигурации, чтобы удалить унаследованные строки подключения. http://msdn.microsoft.com/en-us/library/ayb15wz8(v=vs.90).aspx

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

Ответ 4

В MSDN есть хорошая статья: https://msdn.microsoft.com/en-us/library/ms254494(v=vs.110).aspx.

Цитата из статьи:

Чтобы сохранить строки подключения во внешнем файле конфигурации, создайте отдельный файл, содержащий только раздел connectionStrings. Делать не включать никаких дополнительных элементов, разделов или атрибутов. Эта пример показывает синтаксис внешнего файла конфигурации.

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

Надеюсь, что это поможет людям, которые столкнутся с этим вопросом позже.