Низ за свързване на SQL Express: местоположение на mdf файл спрямо местоположението на приложението

Използвам бази данни SQL Express като част от единичен тестов проект в c#. Моите бази данни се намират тук:

./Databases/MyUnitTestDB.mdf

Бих искал да използвам относителен път или променлива в app.config, вместо да дефинирам низа си за връзка като:

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

Виждал съм използването на |DataDirectory|, но прав ли съм, като смятам, че това е приложимо само за уеб приложения?

Искам да контролирам това в конфигурационния файл на приложението, тъй като в производството приложението използва хоствана sql база данни.


person Adam Jenkin    schedule 17.08.2010    source източник


Отговори (7)


Благодаря на всички, използвах комбинация от вашите отговори.

В моя файл app.config моят низ за връзка е дефиниран по следния начин

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

В моя модулен тестов клас задавам свойството DataDirectory, като използвам следното

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

    // rest of initialize implementation ...
}
person Adam Jenkin    schedule 17.08.2010
comment
За да научите повече за термина DataDirectory: msdn.microsoft .com/en-us/library/cc716756.aspx (потърсете DataDirectory, това е в края на документа) - person Yves M.; 14.03.2014

Да, |DataDirectory| уеб приложение за избор на директорията App_Data на уеб приложението.

В неуеб приложение, в зависимост от .NET Framework, може да се използва и също така да се променя чрез AppDomain.SetData

Но имате други две възможности за създаване на връзката:

1.- Използвайте относителен път:

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

2.- вземете пътя на приложението и добавете към низа.
В c# Windows Application можете да използвате Application.StartupPath

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

В зависимост от типа на приложението или режима на стартиране получавате различни свойства. Пример:

  • Application.StartupPath -- Началният път на exe приложението, което стартира приложението
  • Application.ExecutablePath -- началният път име на exe приложението, което показва приложението. Но за да използвате Application, трябва да включите System.Windows.Forms, който не е включен например в конзолни приложения.

  • System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) -- Това получава пътя от текущото сглобяване "dll,exe,..." Не се влияе от типа на приложението, промените в пътя,... Винаги връщайте директорията, когато се намира Assemby.

  • Environment.CurrentDirectory -- текущата директория. Това може да се промени, например, ако навигирате в папки.

Можете да намерите повече за различните опции за низ за връзка тук http://www.connectionstrings.com/sql-server-2005

person Dubas    schedule 17.08.2010
comment
Благодаря, Дубас, опция 1 е това, което искам да използвам, но не мога да накарам това да работи. - person Adam Jenkin; 17.08.2010
comment
Вариант 1 зависи от вашия път на изпълнение. Ако вашият UInit тест се изпълнява с различен път, вашето приложение вероятно използването на относителен път ви води до различен път от очаквания път. - person Dubas; 17.08.2010
comment
@Dubas |Директория с данни| променливата не е само за уеб приложения, можете да я използвате навсякъде - person Anton Kalcik; 01.09.2016

Прекарах цял ден в гугъл, за да се справя с това и най-накрая имам представа от това

Ето моето решение:
1. Използвайте |DataDirectory| в низ за връзка

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

2. Задайте DataDirectory в 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);
}

въведете описание на изображението тук

person nonetaku    schedule 15.06.2011

Създавам просто приложение за Windows Forms с VS2010 с C#3.0. Също така използва SQL Express 2008 RC2.

Мога да използвам: |DataDirectory|MyDb.mdf в низа за връзка самостоятелно, без да променям нищо друго. |DataDirectory| сочи към местоположението на моя .exe файл.

Мисля, че това ще бъде първото нещо, което всички вие ще опитате, затова посочвам моята VS и SQL версия. Или може би е нов за C#3.0.

Моят пълен низ за връзка:

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

Обърнете внимание, че добавих папка "App_Data" към моето приложение, тъй като съм свикнал с Db в тази папка, папката не се разпознава от VS.

person Wasted_Coder    schedule 26.02.2012
comment
Перфектно решение. благодаря - person sapatelbaps; 03.05.2019

Тук нямам Visual Studio, но какво да кажем за:

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

string appPath = Path.GetDirectoryName(Application.ExecutablePath);
AttachDBFilme = appPath + "\\MyUnitTestDB.mdf"
person João Pereira    schedule 17.08.2010
comment
Бих предложил нещо в тази насока, може би използвано заедно с създателите на низове за връзка на ADO.NET, за да съставите крайния низ за връзка. - person stakx - no longer contributing; 17.08.2010

Направих следното. Дано помогне на някого.

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data"));
person cgatian    schedule 26.02.2015

Динамичен път в SQL Server връзка

SqlConnection  con="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Database=MyDatabaseForTesting;Trusted_Connection=Yes;" ;
person Mohit Kotak    schedule 25.08.2014