2016-12-18 20 views
0

Я попытался отделить мою локальную базу данных .mdf скопировать ее в другую папку и приложить новый файл при запуске и скопировать в старшую папку при закрытии.Отсоедините локальную базу данных .mdf, скопируйте, прикрепите новый файл

Кажется, к работам на старте, но у меня есть ошибки при закрытии формы:

Процесс не может получить доступ к файлу «C: \ ProgramData \ MyData \ db1.mdf», так как он используется другой процесс.

Вот мой код:

public Form() 
    { 
     InitializeComponent(); 
     DetachDatabase(); 
     CopyDb(); 
     AttachDatabase(); 
     AppDomain.CurrentDomain.SetData("DataDirectory", Data.MyNewFolder);  
    } 


    public static bool DetachDatabase() 
    { 
     try 
     { 

      string connectionString = String.Format(@"Data Source=(LocalDB)\v11.0;Initial Catalog=master;Integrated Security=True"); 
      using (var cn = new SqlConnection(connectionString)) 
      { 
       cn.Open(); 
       SqlCommand cmd = cn.CreateCommand(); 
       cmd.CommandText = String.Format("exec sp_detach_db '{0}'", "db1"); 
       cmd.ExecuteNonQuery(); 
       cmd.CommandText = String.Format("exec sp_detach_db '{0}'", "db2"); 
       cmd.ExecuteNonQuery(); 
       return true; 
      } 
     } 
     catch 
     { 
      return false; 
     } 
    } 

    public static bool AttachDatabase() 
    { 
     try 
     { 
      string connectionString = String.Format(@"Data Source=(LocalDB)\v11.0;Initial Catalog=master;Integrated Security=True"); 
      using (var cn = new SqlConnection(connectionString)) 
      { 
       cn.Open(); 
       SqlCommand cmd = cn.CreateCommand(); 
       cmd.CommandText = String.Format("exec sys.sp_attach_db db1, 'db1.mdf'"); 
       cmd.CommandText = String.Format("exec sys.sp_attach_db db2, 'db2.mdf'"); 
       cmd.ExecuteNonQuery(); 
       return true; 
      } 
     } 
     catch 
     { 
      return false; 
     } 
    } 

    private void Frm_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     LocalDB.DetachDatabase(); 
     CopyDb(); 
     LocalDB.AttachDatabase(); 
    } 

, что это хороший способ сделать это?

Благодаря

+0

SQL Server является ** на основе сервера ** система баз данных - поэтому ** лучший способ ** это *** НЕ *** скрипку вокруг с '.mdf' файлов и просто оставьте базу данных ** на сервере ** и подключитесь к ней и используйте ее –

ответ

1

Вы должны переключиться на master и поставить целевой базы данных в автономном режиме

ПРЕДУПРЕЖДЕНИЕ: Используйте на свой страх и риск (например, вы можете использовать WITH ROLLBACK IMMEDIATE?)

var commandText = string.Format(@" 
    USE MASTER; 
    ALTER DATABASE {0} SET OFFLINE WITH ROLLBACK IMMEDIATE; 
    EXEC sp_detach_db '{0}', 'true';", "db1"); 

второй параметр до sp_detach_db просто избегает обновления статистики (будет быстрее)

Теперь вы можете безопасно перемещать mdf и ldf файлы из исходного расположения

Если предположить, что база данных уже в автономном режиме и вы переместили файл db1.mdf в D:\Whatever, я думаю, что вы можете сделать это (я не проверял, остерегайтесь)

var commandText = string.Format(@" 
    USE MASTER; 
    ALTER DATABASE {0} 
     MODIFY FILE (
     NAME = '{0}', 
     FILENAME = 'D:\Wherever\{0}.mdf'); 
    ALTER DATABASE {0} SET ONLINE;", "db1"); 
+0

спасибо за вашу помощь. Я использую это при запуске. – KTG

+0

для закрытия db по-прежнему подключен, но я нашел, что он сделал это var start = new ProcessStartInfo ("sqllocaldb", "stop MSSQLLocalDB"); start.WindowStyle = ProcessWindowStyle.Hidden; используя (var stop = Process.Start (start)) stop.WaitForExit(); start.Arguments = "удалить MSSQLLocalDB"; using (var delete = Process.Start (start)) delete.WaitForExit(); – KTG

+0

Мне интересно, нет ли способа принудительно отключить БД до того, как вызов вернется (например, установите один пользовательский режим, вернитесь к нескольким пользователям после повторного присоединения). Перезапуск процесса не кажется правильным, но, ну ...: D Aslo, если это ваша основная форма, почему бы не отсоединиться/присоединиться после того, как форма полностью уничтожена (а также до ее создания), а не используя обработчик событий? –

 Смежные вопросы

  • Нет связанных вопросов^_^