2016-12-18 82 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只是避免統計更新(會更快)

你現在可以安全地mdfldf文件從原來的位置

移動假設你的數據庫已經離線,你已經動了你的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

爲關閉數據庫仍然附加,但我發現th爲做 var start = new ProcessStartInfo(「sqllocaldb」,「stop MSSQLLocalDB」); start.WindowStyle = ProcessWindowStyle.Hidden;使用(var stop = Process.Start(start)) stop.WaitForExit(); start.Arguments =「刪除MSSQLLocalDB」;使用(var delete = Process.Start(start)) delete.WaitForExit(); – KTG

+0

我想知道在呼叫返回之前是否無法強制數據庫完全分離(例如設置單用戶模式,重新連接後返回多用戶)。重新啓動這個過程並不覺得是正確的,但是,嗯......如果這是你的主要形式,爲什麼在表單被完全銷燬之後(以及在它被構造之前)不能分離/附加,而不是使用事件處理程序? –

相關問題