Строка подключения SQL Express: расположение файла mdf относительно расположения приложения - PullRequest
44 голосов
/ 17 августа 2010

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

./Databases/MyUnitTestDB.mdf

Я бы хотел использовать относительный путь или переменную в app.config вместо того, чтобы моя строка подключения определялась как:

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

Я видел использование |DataDirectory|, но правильно ли я считаю, что это применимо только к веб-приложениям?

Я хочу контролировать это в файле конфигурации приложения, так как в работе приложение использует размещенную базу данных sql.

Ответы [ 7 ]

64 голосов
/ 17 августа 2010

Спасибо всем, я использовал комбинацию ваших ответов.

В моем файле 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 ...
}
11 голосов
/ 17 августа 2010

Да, | 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 - Путь запуска exe-приложения, которое запускает приложение
  • Application.ExecutablePath - начальный путь - имя exe-приложения, которое описывает приложение. Но для использования Application вам необходимо включить System.Windows.Forms, который не включен, например, в консольные приложения.

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

  • Environment.CurrentDirectory - текущий каталог.Это можно изменить, например, при переходе по папкам.

Подробнее о различных параметрах строки подключения можно узнать здесь http://www.connectionstrings.com/sql-server-2005

8 голосов
/ 15 июня 2011

Я потратил целый день на поиски в интернете и, наконец, получил подсказку от this

Вот мое решение:
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);
}

enter image description here

4 голосов
/ 26 февраля 2012

Я создаю простое приложение для 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.

2 голосов
/ 17 августа 2010

У меня нет Visual Studio здесь, но как насчет:

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

string appPath = Path.GetDirectoryName(Application.ExecutablePath);
AttachDBFilme = appPath + "\\MyUnitTestDB.mdf"
1 голос
/ 26 февраля 2015

Я сделал следующее. Надеюсь, это кому-нибудь поможет.

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "../../App_Data"));
0 голосов
/ 25 августа 2014

Динамический путь в соединении с SQL Server

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