40

Utilizzo database SQL Express come parte di un progetto di test di unità in C#. Il mio database si trova qui:Stringa di connessione SQL Express: percorso file mdf relativo al percorso dell'applicazione

./Databases/MyUnitTestDB.mdf 

Vorrei utilizzare un percorso relativo o variabile nel app.config piuttosto che avere la mia stringa di connessione definita come:

AttachDbFilename=C:\blah\blah\blah\yea\yea\yea\MyApplication\Databases\MyUnitTestDB.mdf 

ho visto l'uso di |DataDirectory| ma ho ragione nel ritenere che ciò sia applicabile solo alle applicazioni web?

Voglio controllarlo nel file di configurazione dell'applicazione, poiché in produzione l'applicazione utilizza un database sql ospitato.

risposta

58

Grazie a tutti, ho usato una combinazione delle vostre risposte.

Nel mio app.config presentare la mia stringa di connessione è definito come segue

<add name="MyConnectionString" 
    connectionString="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" /> 

Nella mia classe unit test ho impostato la proprietà DataDirectory utilizzando il seguente

[TestInitialize] 
public void TestInitialize() 
{ 
    AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Databases")); 

    // rest of initialize implementation ... 
} 
+0

Per ulteriori informazioni sul termine ** DataDirectory **: http://msdn.microsoft.com/en-us/library/cc716756.aspx (cercare " DataDirectory ", è alla fine del documento) –

2

non ho Visual Studio qui, ma per quanto riguarda:

using System.IO; 
using System.Windows.Forms; 

string appPath = Path.GetDirectoryName(Application.ExecutablePath); 
AttachDBFilme = appPath + "\\MyUnitTestDB.mdf" 
+2

Vorrei suggerire qualcosa lungo quella linea, forse utilizzati insieme con i costruttori [stringa di connessione] di ADO.NET (http://msdn.microsoft.com/en-us/library/ms254947.aspx) per mettere insieme la stringa di connessione finale. – stakx

12

Sì, | DataDirectory | Applicazione Web per selezionare la directory App_Data dell'applicazione Web.

In una non applicazione web, a seconda del .NET Framework, potrebbe essere utilizzato e cambiato anche usando AppDomain.SetData

Ma avete altre due posiblities per creare la connessione:

1 .- Utilizzare un percorso relativo:

String con ="... AttachDbFilename=Databases\MyUnitTestDB.mdf ... "; 

2.- ottenere il percorso dell'applicazione e aggiungere alla stringa.
in C# Applicazione Windows è possibile utilizzare Application.StartupPath

String con= " ... AttachDbFilename=" + Application.StartupPath + "\Databases\MyUnitTestDB.mdf ... "; 

A seconda del tipo applicaiton o la modalità di lancio che hai diverse proprietà. Es:

  • Application.StartupPath - Il percorso di avvio dell'applicazione exe che avvia l'applicazione
  • Application.ExecutablePath - il percorso di avvio di un nome dell'applicazione exe che stats l'applicazione Ma per utilizzare l'applicazione è necessario includere System.Windows.Forms che non è incluso, ad esempio, nelle applicazioni della console.

  • System.IO.Path.GetDirectoryName (.. System.Reflection.Assembly.GetExecutingAssembly() GetName() Codebase) - Questo diventa il percorso dal gruppo corrente "dll, exe, ... "Non è influenzato dal tipo di applicazione, dai cambiamenti di percorso, ... Restituisce sempre la directory quando risiede l'Assemby.

  • Environment.CurrentDirectory - la directory corrente. Questo può essere modificato ad esempio se navighi in cartelle.

È possibile trovare maggiori informazioni sulle diverse opzioni della stringa di connessione qui http://www.connectionstrings.com/sql-server-2005

+0

Grazie Dubas, l'opzione 1 è ciò che voglio usare, ma non riesco a farlo funzionare. –

+0

L'opzione 1 dipende dal percorso di esecuzione. Se il test UInit sta eseguendo con un percorso diverso che l'applicazione probabilmente l'uso di un percorso relativo ti fornisce un percorso diverso rispetto al percorso previsto. – Dubas

+0

+1 Ottima risposta – sohaiby

6

ho passato un giorno intero googling per lavorare su questo e finalmente avere un indizio da this

Ecco la mia soluzione:
1. Usa | DataDirectory | in stringa di connessione

<add name="NorthwindConnectionString" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDbFilename=|DataDirectory|\Northwind.mdf;User Instance=True" providerName="System.Data.SqlClient" /> 

2.Set DataDirectory in ClassInitialize

[ClassInitialize()] 
public static void MyClassInitialize(TestContext testContext) 
{ 
    string baseDir = AppDomain.CurrentDomain.BaseDirectory; 
    int index = baseDir.IndexOf("TestResults"); 
    string dataDir = baseDir.Substring(0, index) + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; 
    AppDomain.CurrentDomain.SetData("DataDirectory", dataDir); 
} 

enter image description here

3

Sto costruendo un semplice Windows Forms App con VS2010 con C# 3.0. Utilizza anche SQL Express 2008 RC2.

Sono in grado di utilizzare: |DataDirectory|MyDb.mdf nella stringa di connessione da solo senza modificare qualcos'altro. Il |DataDirectory| punta alla posizione del mio file .exe.

Penserò che questa sarebbe la prima cosa che tutti proverebbero, ecco perché sto specificando la mia versione VS e SQL. O forse è nuovo di C# 3.0.

mia completa stringa di connessione:

"Server=.\SQLExpress;AttachDbFilename=|DataDirectory|App_Data\ThumbsUpPlayer.mdf;Database=ThumbsUpPlayer;Trusted_Connection=Yes;" 

Si noti che ho aggiunto una cartella "App_Data" per la mia domanda, perché sono abituato al Db in quella cartella, la cartella non viene riconosciuto dal VS.

+2

Intendevi dire" App_Data "invece di" App_Code "nell'ultima frase? – Manfred

+0

@Manfred sì, hai ragione! Risposta modificata –

0

dinamica Percorso in SQL Server Connection

SqlConnection con="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" ; 
0

ho fatto quanto segue. Spero che aiuti qualcuno.

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data")); 
Problemi correlati