2010-03-04 25 views
10

Qual è un buon approccio alla gestione di una stringa di connessione di debug e release in un'applicazione .NET/SQLServer?Gestione di una stringa di connessione di debug e release

Ho due SQL Server, una produzione e un build/debug e ho bisogno di un metodo di passaggio tra i due quando viene distribuita la mia applicazione ASP.NET.

Attualmente li memorizzo semplicemente nel web.config e commento uno o l'altro fuori, comunque che è soggetto a errori durante la distribuzione.

risposta

13

Creare una versione di debug e rilascio del file Web.config, ad es. Web.debug.config e Web.release.config. Quindi aggiungi una condizione di pre-compilazione che copia la versione pertinente nel web.config in base alla Target corrente.

Modifica: Per aggiungere la condizione di pre compilazione, fare clic con il tasto destro del mouse sul progetto e selezionare "Proprietà", quindi andare alla scheda "Crea eventi" e aggiungere il codice sotto alla condizione di precompilazione. Ovviamente, dovrai ammettere il codice alle tue esigenze, vedi l'immagine qui sotto.

@echo off 

echo Configuring web.config pre-build event ... 

if exist "$(ProjectDir)web.config" del /F/Q "$(ProjectDir)web.config" 

if "$(ConfigurationName)" == "Debug Test" goto test 
if "$(ConfigurationName)" == "Debug M" goto M 
if "$(ConfigurationName)" == "Debug BA" goto BA 
if "$(ConfigurationName)" == "Release Test" goto test 
if "$(ConfigurationName)" == "Release M" goto M 
if "$(ConfigurationName)" == "Release BA" goto BA 

echo No web.config found for configuration $(ConfigurationName). Abort batch. 
exit -1 
goto :end 

:test 
copy /Y "$(ProjectDir)web.config.test" "$(ProjectDir)web.config" 
GOTO end 

:BA 
copy /Y "$(ProjectDir)web.config.BA" "$(ProjectDir)web.config" 
GOTO end 

:M 
copy /Y "$(ProjectDir)web.config.M" "$(ProjectDir)web.config" 
GOTO end 

:end 
echo Pre-build event finished 

Project Properties http://img442.imageshack.us/img442/1843/propsa.jpg

+0

Penso che questo sia un buon suggerimento. Puoi approfondire come aggiungere una condizione di precompilazione a un progetto VS-2008? Non sto usando MSBuild o altri processi di compilazione. Semplicemente pulisco/ricostruisco e distribuisco da Visual Studio. –

+0

@roygbiv: vedere modifica. – AxelEckenberger

+0

Grazie amico. Il tuo metodo e codice di esempio ha fatto un lavoro breve di questa attività. –

2

Di solito imposto una variabile di ambiente sui miei server di produzione che indica che il server è un server di produzione. Ho quindi letto la stringa di connessione corretta dal mio web.config in base alla presenza di questa variabile di ambiente ed è impostata sul valore di produzione.

+0

+1 Mi piace l'idea di modificare qualcosa sul server stesso. Questo sembra meno incline agli errori rispetto agli altri approcci. –

+0

Grazie per questo suggerimento. È forse il più pratico e conveniente. –

+0

Non ho mai pensato a questo. –

0

Beh, forse questo è un po 'obsoleto, ma lo ODBC DSN risolve abbastanza bene questo problema - utilizzo ancora - con rigore - le impostazioni DNS per differenziare gli ambienti di produzione e di debug.

p.s., Mi aspetto un sacco di voti negativi, forse questo sarà un indicatore di ciò che le persone pensano di un livello di riferimento per gli identificatori di database.

+0

Anche se non penso che la tua risposta meriti un downvote, non voglio davvero seguire il percorso DSN. –

8

La buona notizia è che .NET4 ha a provision per questo, è possibile avere configurazioni separate per ogni configurazione (web.Release.config, web.Debug.config).

La cattiva notizia è ... probabilmente non lo stai ancora usando.

+0

Sei corretto, non sto usando .NET 4 :( –

+0

Presto ... molto presto ... :) – jjxtra

4

direttive del preprocessore Uso: quando il progetto è configurato per l'esecuzione in modalità di debug, verrà scelta la stringa di connessione di debug, altrimenti la stringa di connessione di rilascio sarà scelto automaticamente.

In Visual Studio si noterà che le istruzioni vengono disattivate esclusivamente in base alla configurazione del progetto (debug o release).

Basta aggiungere qualcosa di simile al seguente nel codice:

string myConnectionString; 
#if DEBUG 
    myConnectionString = "your debug connection string";//may be read from your debug connection string from the config file 
#else 
    myConnectionString = "your release connection string"; //may be read from your relase connection string from the config file 
#endif 

per maggiori dettagli, controllare this.

1

Uso una combinazione di metodo Sameh e Obalix in .net 3.5.

public static class DataConnection 
{ 
#if LOCALDEV 
    public const string Env = "Debug"; 
#endif 
#if STAGING 
    public const string Env="Staging"; 
#endif 
#if RELEASE 
    public const string Env="Release"; 
#endif 
    private static ConnectionStringSettingsCollection _connections; 
    static DataConnection() 
    { 
     _connections = ConfigurationManager.ConnectionStrings; 

    } 

    public static string BoloConnectionString 
    { 
     get 
     { 
      return _connections["DB1."+Env].ConnectionString; 
     } 
    } 
    public static string AOAConnectionString 
    { 
     get 
     { 
      return _connections["DB2."+Env].ConnectionString; 
     } 
    } 
    public static string DocVueConnectionString 
    { 
     get 
     { 
      return _connections["DB3."+Env].ConnectionString; 
     } 
    } 
} 

Poi nelle mie proprietà del progetto, definisco i giusti simboli di compilazione condizionale. In questo modo non devo mantenere le mie stringhe di connessione codificate come quelle di Sameh, ma il codice cerca solo la stringa in base a come è stata costruita. Questo mi consente di avere (se necessario) un file di configurazione per tutte le build, ma in realtà non distribuisco i file di configurazione nel mio processo di compilazione.Anche se l'app condizionale.Relase.config per .net 4 sembra la strada giusta da percorrere in futuro.

0

Posso dire un'altra soluzione per questo problema. Nel file csproj creare folow:

<Content Include="DB.config"> 
    <SubType>Designer</SubType> 
</Content> 
    <Content Include="DB.Debug.config"> 
    <DependentUpon>DB.config</DependentUpon> 
    <SubType>Designer</SubType> 
</Content> 
    <Content Include="DB.Release.config"> 
    <DependentUpon>DB.config</DependentUpon> 
    <SubType>Designer</SubType> 
</Content> 

In xml scritto impostare le due versioni per il rilascio e il debug.

Problemi correlati