40

Używam baz danych SQL Express jako część projektu testów jednostkowych wC#. Moje bazy danych znajduje się tutaj:Ciąg połączenia SQL Express: lokalizacja pliku mdf względem lokalizacji aplikacji

./Databases/MyUnitTestDB.mdf 

Chciałbym użyć ścieżki względnej lub zmienną w app.config zamiast mój ciąg połączenia zdefiniowany jako:

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

Widziałem użycia |DataDirectory| ale czy mam rację, sądząc, że dotyczy to wyłącznie aplikacji internetowych?

Chcę to kontrolować w pliku konfiguracyjnym aplikacji, ponieważ w produkcji aplikacja korzysta z hostowanej bazy danych sql.

Odpowiedz

58

Dzięki wszystkim, użyłem kombinacji swoimi odpowiedziami.

W moim app.config złożyć mój ciąg połączenia jest zdefiniowany następująco

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

W mojej klasie testów jednostkowych ustawić właściwość DataDirectory stosując następujące

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

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

Aby dowiedzieć się więcej na temat ** DataDirectory **: http://msdn.microsoft.com/en-us/library/cc716756.aspx (poszukaj " DataDirectory ", znajduje się na końcu dokumentu) –

2

nie mam Visual Studio tutaj, ale co:

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

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

chciałbym zaproponować coś wzdłuż tej linii, być może używany razem z [budowniczych ciąg połączenia] w ADO.NET (http://msdn.microsoft.com/en-us/library/ms254947.aspx), aby umieścić razem ostatni ciąg połączenia. – stakx

12

Tak, | DataDirectory | Aplikacja internetowa do wybierania katalogu App_Data aplikacji internetowej.

W nie aplikacji internetowych, w zależności od .NET Framework, może być używany, a także zmieniać za pomocą AppDomain.SetData

Ale masz inne dwa posiblities do utworzenia połączenia:

1 .- użyć ścieżki względnej:

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

2.- uzyskać ścieżkę aplikacji i dodać do ciągu.
w C# aplikacji Windows można użyć Application.StartupPath

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

zależności od rodzaju applicaiton lub tryb uruchomić dostałeś różne właściwości. Ex:

  • Application.StartupPath - ścieżka startu aplikacji exe, który uruchamia aplikację
  • Application.ExecutablePath - drogi startowej nazwę aplikacji EXE statystyki aplikację Aby korzystać z aplikacji, należy dołączyć pliki System.Windows.Forms, które nie zostały uwzględnione na przykład w aplikacjach konsolowych.

  • System.IO.Path.GetDirectoryName (.. System.Reflection.Assembly.GetExecutingAssembly() getName() CODEBASE) - ten uzyskuje ścieżkę z obecnego zespołu „dll, exe ... "Nie ma na nie wpływu typ aplikacji, zmiany ścieżki, ... Zawsze zwracaj katalog, gdy rezyduje w nim Assemby.

  • Environment.CurrentDirectory - aktualny katalog. Można to zmienić na przykład po przejściu do folderów.

można znaleźć więcej informacji na temat różnych opcji tutaj ciąg połączenia http://www.connectionstrings.com/sql-server-2005

+0

Dzięki Dubas, opcja 1 jest tym, czego chcę użyć, ale nie mogę tego zrobić. –

+0

Opcja 1 zależy od Twojej ścieżki wykonywania. Jeśli Twój test UInit jest wykonywany z inną ścieżką, prawdopodobnie aplikacja korzystająca ze ścieżki względnej daje inną ścieżkę niż oczekiwana ścieżka. – Dubas

+0

+1 Świetna odpowiedź – sohaiby

6

spędziłem cały dzień Googling, aby to przetworzyć i wreszcie mieć wskazówkę od this

Oto moje rozwiązanie:
1. Użyj | DataDirectory | w ciągu połączenia

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

2.Set DataDirectory w 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

buduję prostą aplikację Windows Forms z VS2010 z C# 3.0. Również za pomocą SQL Express 2008 RC2.

Jestem w stanie użyć: |DataDirectory|MyDb.mdf w samym ciągu połączenia bez zmiany czegokolwiek innego. Numer |DataDirectory| wskazuje lokalizację pliku .exe.

Pomyślę, że to pierwsza rzecz, którą wszyscy byście spróbowali, dlatego właśnie określam moją wersję VS i SQL. A może to nowość w C# 3.0.

mój pełny String Connection:

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

Zauważ, że dodałem folder „App_Data” do mojego wniosku, bo jestem przyzwyczajony do DB w tym folderze, folder nie jest rozpoznawany przez VS.

+2

Czy chcesz powiedzieć" App_Data "zamiast" App_Code "w ostatnim zdaniu? – Manfred

+0

@Manfred tak, masz rację! Edytowana odpowiedź. –

0

dynamiczna ścieżka w SQL Server Connection

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

zrobiłem co następuje. Mam nadzieję, że to komuś pomaga.

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data")); 
Powiązane problemy