Подтвердить что ты не робот

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

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

./Databases/MyUnitTestDB.mdf

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

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

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

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

4b9b3361

Ответ 1

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

В моем файле app.config моя строка соединения определяется следующим образом

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

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

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

    // rest of initialize implementation ...
}

Ответ 2

Да, | DataDirectory | Веб-приложение для выбора каталога App_Data веб-приложения.

В не веб-приложении, в зависимости от .NET Framework, его можно было бы использовать и также изменять с помощью AppDomain.SetData​​p >

Но у вас есть две другие возможности для создания соединения:

1. Используйте относительный путь:

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

2.- получить путь приложения и добавить в строку.
В С# приложении Windows вы можете использовать Application.StartupPath

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

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

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

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

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

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

Ответ 3

Я потратил целый день на поиски работы над этим поиском и, наконец, получил ключ от 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

Я создаю простое приложение Windows Forms с VS2010 с С# 3.0. Также используется SQL Express 2008 RC2.

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

Я подумаю, что это будет первое, что вы все попробуете, поэтому я указываю свою версию VS и SQL. Или, возможно, это ново для С# 3.0.

Моя полная строка подключения:

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

Обратите внимание, что я добавил в приложение папку "App_Data", потому что я использую Db в этой папке, папка не распознается VS.

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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