C# Visual Studio: |DataDirectory| ключевое слово в конфликте строк соединения
Работает над проектом приложения Windows Form с 2 разработчиками. Обмен исходными кодами через tfs заменил путь к каталогу данных |DataDirectory|
Ключевое слово как каталоги данных различны на каждом ПК. (C:\Users\username\Documents\Visual Studio 20XX\Projects\solution folder\solution folder
)
Использовали этот относительный путь в строке подключения как
class ConnectionManager
{
public static SqlConnection dbcon()
{
string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\systemdb.mdf;Integrated Security=True";
SqlConnection con = new SqlConnection(connectionString);
con.Open();
return con;
}
}
Проблема в том, что приложение C# отправляет данные в базу данных SQL Server, оно показывает, что данные были добавлены в базу данных, но фактически база данных не обновляется.
Обнаружил, что строка подключения конфликтует .mdf
файл, расположенный в корневой папке с .mdf
находится в bin\debug
, SELECT
запросы работают нормально при использовании |DataDirectory|
, Запрос INSERT не работает при использовании |DataDirectory|
, но отлично работает при использовании фактического пути к каталогу вместо |DataDirectory|
,
Как решить эту проблему? Требования:
Не нужно изменять пути к каталогам каждый раз после получения последней версии от tfs, нужно что-то вроде
|DataDirectory|
оставаться всегда.Строка подключения не должна конфликтовать с
.mdf
файлы в корневой папке иbin\debug
папка.
1 ответ
Весь подход AttachDbFileName= имеет недостатки - в лучшем случае! При запуске приложения в Visual Studio оно будет копироваться по всему .mdf
файл (из вашего App_Data
каталог в выходной каталог - обычно .\bin\debug
- где работает ваше приложение) и, скорее всего, ваше INSERT
работает просто отлично - но в итоге вы смотрите не тот файл.mdf!
Если вы хотите придерживаться этого подхода, попробуйте установить точку останова на myConnection.Close()
позвоните - а затем осмотрите .mdf
файл с SQL Server Mgmt Studio Express - я почти уверен, что ваши данные там.
На мой взгляд, реальным решением было бы
установить SQL Server Express (и вы уже сделали это в любом случае)
установить SQL Server Management Studio Express
создайте свою базу данных в SSMS Express, дайте ей логическое имя (например,
systemdb
)подключитесь к нему, используя его логическое имя базы данных (заданное при его создании на сервере), и не связывайтесь с физическими файлами базы данных и пользовательскими экземплярами. В этом случае ваша строка подключения будет выглядеть примерно так:
Data Source=.\\SQLEXPRESS;Database=systemdb;Integrated Security=True
а все остальное точно так же, как и раньше...
Также см. Отличный пост в блоге Аарона Бертранда. Плохие привычки: использовать AttachDbFileName для получения дополнительной информации.