Строка соединения 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.
Ответы
Ответ 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.SetDatap >
Но у вас есть две другие возможности для создания соединения:
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"));