DrgIonuţ Ответов: 2

Как прикрепить базу данных mssql с помощью относительного пути?


Я хотел бы иметь возможность присоединить БД, используя относительный путь. Это означает, что вместо использования 'C:\Release\App_Data\TRTF_TagLogging.mdf', я должен использовать '.\App_Data\TRTF_TagLogging.mdf'. Используя '.\App_Data\TRTF_TagLogging.mdf', я получаю 'System.Data.SqlClient.SqlException (0x80131904): произошла ошибка активации файла. Физическое имя файла '.\App_Data\TRTF_TagLogging.mdf' может быть неверным.'
Как я мог это сделать?

Что я уже пробовал:

Я могу прикрепить базу данных mssql при нажатии кнопки с помощью этого кода:
using (SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=;Integrated Security=True; MultipleActiveResultSets = true")) 
            {
                using (SqlCommand cmd = new SqlCommand("", connection))
                {
                    using (SqlCommand cmd1 = new SqlCommand("", connection))
                    {
                        try
                        {
                            cmd.CommandText = "CREATE DATABASE [TRTF_TagLogging] ON (FILENAME ='C:\\Release\\App_Data\\TRTF_TagLogging.mdf'),(FILENAME ='C:\\Release\\App_Data\\App_Data\\TRTF_TagLogging_log.ldf') FOR ATTACH";

                            cmd1.CommandText = "if(exists(select * from sys.databases where name = 'TRTF_TagLogging')) PRINT 'DB attached'";

                            connection.Open();
                            cmd.ExecuteNonQuery();
                            cmd1.ExecuteNonQuery();
                            //the rest of the code

2 Ответов

Рейтинг:
8

DrgIonuţ

Мне удалось решить ее вот так:

string path = Directory.GetCurrentDirectory();
cmd.CommandText = @"CREATE DATABASE [TRTF_TagLogging] ON (FILENAME ='" + path + @"\App_Data\TRTF_TagLogging.mdf'),(FILENAME ='" + path + @"\App_Data\TRTF_TagLogging_log.ldf') FOR ATTACH";


Каталог.GetCurrentDirectory() возвращает C:\Release-да.


Рейтинг:
1

OriginalGriff

Проблема в том, что относительный путь именно таков: относителен.
Это относится к процессу, который пытается получить доступ к пути - который в случае серверного ядра базы данных, такого как SQL Server или MySql, не является процессом, выполняющим ваш код.
Таким образом, путь может быть правильным с точки зрения вашего программного обеспечения, но вряд ли будет правильным с точки зрения POV сервера.
По этой причине - среди прочих - не пытайтесь использовать относительный путь. И определенно не пытайтесь хранить базы данных в той же папке, что и ваше приложение, или в подпапке этой папки. Он может работать в dev, но в производстве он сильно провалится. Существует также забава и игры, что в производстве серверное и клиентское программное обеспечение, скорее всего, будут находиться на разных машинах, поэтому система БД почти наверняка не будет иметь никакого доступа к локальному относительному пути вообще!

Вы также не должны использовать фиксированные строки подключения или пытаться присоединить БД в производственном коде: БД должна постоянно находиться под полным контролем сервера БД, иначе вы получите несколько копий, используемых несколькими пользователями, и все это развалится.