Строка подключения SQL Express: расположение файла mdf относительно расположения приложения

Я использую базы данных SQL Express как часть проекта модульного тестирования в С#. Мои базы данных находятся здесь:

./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.StartupPath

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

В зависимости от типа приложения или режима запуска вы получаете разные свойства. Бывший:

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

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

  • 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
@Дубас |DataDirectory| переменная не только для веб-приложений, вы можете использовать ее где угодно - person Anton Kalcik; 01.09.2016

Я потратил целый день на поиски в Google, чтобы разобраться с этим, и, наконец, получил подсказку от это

Вот мое решение:
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», потому что я привык к БД в этой папке, папка не распознается 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