web-dev-qa-db-ja.com

外部設定ファイルから接続文字列を読み取る

コンソールアプリケーションと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>

Connections.configファイル

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

ここで私は2つのことを観察しました。最初:configSourceを指定すると、接続文字列を読み取ることができません(例外をスローします)。

2番目:同じ接続文字列をApp.configファイルに入れて読み込もうとすると、コードは機能しますが、2つの接続文字列を取得します(空の文字列を1つだけ返すことになっています)最初の接続文字列は次のようなsqlexpress接続文字列です

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

返される2番目の接続文字列は空の文字列です(これは予期されています)。

シナリオのように、外部ファイルから接続文字列を読み取りたい。どうやってするか?ここで何が欠けていますか?

13
PSR

MSDNによると

追加の要素、セクション、または属性を含めないでください。

XMLエンコーディングを削除する必要があります。

編集

また、設定ファイルのプロパティをCopy to Output Directory = Copy if newerまたはCopy alwaysに設定する必要があります。

enter image description here

編集2

Daveが言ったことに基づいて構築するには、外部ファイルにclear要素を追加します。最終的なConnections.configファイルは次のようになります。

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

Connections.configファイルは、xmlヘッダーなしで次のようになります。

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

また、コンソールアプリケーションでファイルを正しく見つけるには、出力ディレクトリにコピー常にコピーまたはCopy If Newer

6
Patrick D'Souza

取得する最初の接続文字列は、machine.configから継承されます。これは、MSDNのドキュメントで説明されています。 http://msdn.Microsoft.com/en-us/library/bf7sd233(v = vs.90).aspx

構成ファイルのClearタグを使用して、継承された接続文字列を削除できます。 http://msdn.Microsoft.com/en-us/library/ayb15wz8(v = vs.90).aspx

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

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>

これが後でこの質問に遭遇する人々に役立つことを願っています。

0
tranmq