10

Ho creato un'applicazione di console e un file app.config e il file Connections.config. Il file app.config ha una fonte di proprietà ConnectionString che punta alla Connections.configLettura stringa di connessione da file di configurazione esterno

Quando ho provato a leggere la stringa di connessione nella domanda, ho ottenere un ConfigurationErrorException

Questo è il mio metodo principale.

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

App.config del file

<?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> 

Qui ho osservato due cose. Primo: Se si specifica configSource, non riesco a leggere la stringa di connessione (eccezione di lancio)

Secondo: Se inserisco la stessa stringa di connessione nel file App.config e ho provato a leggere, il codice funziona ma si collegano due volte stringa (che dovrebbe essere di ritorno unico che è stringa vuota) La prima stringa di connessione è stringa di connessione sqlexpress simili seconda stringa di connessione

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

che ritorni è stringa vuota (questo è previsto).

Voglio leggere la stringa di connessione da un file esterno come nel mio scenario. Come farlo? Cosa mi manca qui?

risposta

6

MSDN says:

di non inserire ulteriori elementi, sezioni, o attributi.

È necessario rimuovere la codifica XML.

Modifica

Inoltre, è necessario impostare le proprietà del file di configurazione per Copy to Output Directory = Copy if newer o Copy always.

enter image description here

Edit 2

Per costruire su ciò che ha detto Dave, si aggiunge l'elemento clear al file esterno. Il file finale Connections.config dovrebbe apparire esattamente come questo:

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

L'azione di compilazione non è obbligatoria, se Copia nella directory di output è impostata su * copia sempre * o * copia se più recente *, l'azione di default è impostata su Contenuto. Altrimenti ha risposto bene - +1 –

+0

Buon punto, non lo sapevo. –

5

le connessioni.file di configurazione dovrebbe essere come mostrato di seguito, senza intestazione xml

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

anche per poter individuare correttamente il file nell'applicazione di console, impostare la Copia nella directory di output-Copia sempre o Copia se più recente.

+0

xml header non fa alcuna differenza. l'impostazione della copia ha sempre risolto il problema. Grazie. – PSR

1

La prima stringa di connessione che si sta ricevendo è ereditata da machine.config. Questo è descritto nella documentazione MSDN. http://msdn.microsoft.com/en-us/library/bf7sd233(v=vs.90).aspx

È possibile utilizzare il tag Clear nel file di configurazione per rimuovere le stringhe di connessione ereditate. http://msdn.microsoft.com/en-us/library/ayb15wz8(v=vs.90).aspx

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

C'è un bel articolo su MSDN: https://msdn.microsoft.com/en-us/library/ms254494(v=vs.110).aspx.

Citazione dall'articolo:

Per memorizzare le stringhe di connessione in un file di configurazione esterno, creare un file separato che contiene solo la sezione connectionStrings. Non includere elementi aggiuntivi, sezioni o attributi. Questo esempio mostra la sintassi per un file di configurazione esterno.

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

Spero che questo aiuti le persone che gestiscono in questa domanda in seguito.