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|,

Как решить эту проблему? Требования:

  1. Не нужно изменять пути к каталогам каждый раз после получения последней версии от tfs, нужно что-то вроде |DataDirectory| оставаться всегда.

  2. Строка подключения не должна конфликтовать с .mdf файлы в корневой папке и bin\debug папка.

1 ответ

Решение

Весь подход AttachDbFileName= имеет недостатки - в лучшем случае! При запуске приложения в Visual Studio оно будет копироваться по всему .mdf файл (из вашего App_Data каталог в выходной каталог - обычно .\bin\debug - где работает ваше приложение) и, скорее всего, ваше INSERT работает просто отлично - но в итоге вы смотрите не тот файл.mdf!

Если вы хотите придерживаться этого подхода, попробуйте установить точку останова на myConnection.Close() позвоните - а затем осмотрите .mdf файл с SQL Server Mgmt Studio Express - я почти уверен, что ваши данные там.

На мой взгляд, реальным решением было бы

  1. установить SQL Server Express (и вы уже сделали это в любом случае)

  2. установить SQL Server Management Studio Express

  3. создайте свою базу данных в SSMS Express, дайте ей логическое имя (например, systemdb)

  4. подключитесь к нему, используя его логическое имя базы данных (заданное при его создании на сервере), и не связывайтесь с физическими файлами базы данных и пользовательскими экземплярами. В этом случае ваша строка подключения будет выглядеть примерно так:

    Data Source=.\\SQLEXPRESS;Database=systemdb;Integrated Security=True
    

    а все остальное точно так же, как и раньше...

Также см. Отличный пост в блоге Аарона Бертранда. Плохие привычки: использовать AttachDbFileName для получения дополнительной информации.

Другие вопросы по тегам