40

Tôi đang sử dụng cơ sở dữ liệu SQL Express như là một phần của dự án thử nghiệm đơn vị trong C#. cơ sở dữ liệu của tôi nằm ở đây:Chuỗi kết nối SQL Express: vị trí tệp mdf liên quan đến vị trí ứng dụng

./Databases/MyUnitTestDB.mdf 

Tôi muốn sử dụng một đường dẫn tương đối hoặc biến trong app.config thay vì phải chuỗi kết nối của tôi định nghĩa là:

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

Tôi đã thấy việc sử dụng các |DataDirectory| nhưng tôi có đúng khi nghĩ rằng điều này chỉ áp dụng cho các ứng dụng web không?

Tôi muốn kiểm soát điều này trong tệp cấu hình ứng dụng, như trong quá trình sản xuất, ứng dụng sử dụng cơ sở dữ liệu sql được lưu trữ.

Trả lời

58

Cảm ơn tất cả mọi người, tôi đã sử dụng một sự kết hợp của các phản ứng của bạn.

Trong app.config tôi nộp chuỗi kết nối của tôi được định nghĩa như sau

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

Trong lớp đơn vị thử nghiệm của tôi, tôi thiết lập thuộc tính DataDirectory bằng cách sử dụng sau đây

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

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

Để tìm hiểu thêm về thuật ngữ ** DataDirectory **: http://msdn.microsoft.com/en-us/library/cc716756.aspx (tìm kiếm " DataDirectory ", nó ở cuối tài liệu) –

2

Tôi không có Visual Studio ở đây, nhưng những gì về:

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

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

Tôi sẽ đề xuất điều gì đó dọc theo dòng đó, có thể được sử dụng cùng với [xây dựng chuỗi kết nối của ADO.NET] (http://msdn.microsoft.com/en-us/library/ms254947.aspx) để đặt cùng nhau chuỗi kết nối cuối cùng. – stakx

12

Vâng, | DataDirectory | Ứng dụng web để chọn thư mục App_Data của ứng dụng web.

Trong một không ứng dụng web, tùy thuộc vào .NET Framework, nó có thể được sử dụng và cũng thay đổi sử dụng AppDomain.SetData

Nhưng bạn có hai posiblities khác để tạo ra các kết nối:

1 .- Sử dụng một đường dẫn tương đối:

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

2.- lấy đường dẫn ứng dụng và thêm vào chuỗi.
Trong C# Windows Application bạn có thể sử dụng Application.StartupPath

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

Tùy thuộc vào loại Application hoặc chế độ ra mắt bạn có thuộc tính khác nhau. Ví dụ:

  • Application.StartupPath - Con đường khởi đầu của ứng dụng exe bắt đầu ứng dụng
  • Application.ExecutablePath - con đường bắt đầu một tên của ứng dụng exe rằng số liệu thống kê ứng dụng Nhưng để sử dụng Ứng dụng, bạn cần phải bao gồm System.Windows.Forms không được đưa vào ví dụ vào các ứng dụng giao diện điều khiển.

  • System.IO.Path.GetDirectoryName (.. System.Reflection.Assembly.GetExecutingAssembly() getName() codebase) - Đây được con đường từ lắp ráp hiện nay "dll, exe, ... "Không bị ảnh hưởng bởi loại ứng dụng, thay đổi đường dẫn, ... Luôn trả về thư mục khi Assemby cư trú.

  • Environment.CurrentDirectory - thư mục hiện tại. Điều này có thể được thay đổi ví dụ nếu bạn điều hướng vào các thư mục.

Bạn có thể tìm hiểu thêm về các tùy chọn chuỗi kết nối khác nhau ở đây http://www.connectionstrings.com/sql-server-2005

+0

Cảm ơn Dubas, tùy chọn 1 là những gì tôi muốn sử dụng tuy nhiên tôi không thể làm việc này. –

+0

Tùy chọn 1 phụ thuộc vào đường dẫn thực hiện của bạn. Nếu kiểm tra UInit của bạn đang thực hiện với một đường dẫn khác mà ứng dụng của bạn có thể sử dụng đường dẫn tương đối sẽ đưa bạn đến một đường dẫn khác với đường dẫn mong đợi. – Dubas

+0

+1 Câu trả lời hay nhất – sohaiby

6

Tôi đã dành cả ngày googling để làm việc này thông qua và cuối cùng có một đầu mối từ this

Đây là giải pháp của tôi:
1. Sử dụng | DataDirectory | trong chuỗi kết nối

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

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

Tôi đang xây dựng một Windows đơn giản Forms App với VS2010 với C# 3.0. Cũng sử dụng SQL Express 2008 RC2.

Tôi có thể sử dụng: |DataDirectory|MyDb.mdf chỉ trong chuỗi kết nối mà không thay đổi bất kỳ thứ gì khác. |DataDirectory| trỏ đến vị trí tệp .exe của tôi.

Tôi sẽ nghĩ rằng đây sẽ là điều đầu tiên bạn thử, vì vậy đó là lý do tại sao tôi chỉ định phiên bản VS và SQL của mình. Hoặc có thể nó là mới đối với C# 3.0.

tôi hoàn Chuỗi kết nối:

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

Lưu ý rằng tôi đã thêm một "" App_Data thư mục để ứng dụng của tôi, vì tôi quen với Db trong thư mục đó, thư mục không được công nhận bởi VS.

+2

Bạn có ý nói" App_Data "thay vì" App_Code "trong câu cuối cùng không? – Manfred

+0

@Manfred có bạn là chính xác! Câu trả lời đã chỉnh sửa. –

0

Đường dẫn động trong SQL Server Connection

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

tôi đã làm những điều sau đây. Hy vọng nó giúp ai đó.

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data")); 
Các vấn đề liên quan