2014-09-22 95 views
1

我有一個應用程序,它使用EF和LocalDB作爲它的數據庫,由ClickOnce發佈。 這是我第一次使用LocalDB,我不知道如何添加功能到我的應用程序備份/還原數據庫編程。WPF - 如何以編程方式備份​​/恢復LocalDB - ClickOnce

我的應用程序路徑通過的ClickOnce安裝:

C:\Users\Mahdi Rashidi\AppData\Local\Apps\2.0\NOL11TLW.9XG\CZM702AQ.LPP\basu..tion_939730333fb6fcc8_0001.0002_fd707bbb3c97f8d3 

,這是數據庫文件安裝位置:

C:\Users\Mahdi Rashidi\AppData\Local\Apps\2.0\NOL11TLW.9XG\CZM702AQ.LPP\basu...exe_939730333fb6fcc8_0001.0002_none_8c555c3966727e7f 
  1. 我應該如何備份/恢復數據庫?
  2. 如何讓ClickOnce進一步更新以保持數據庫安全?

非常感謝:)

+0

如何將數據保存到'C:\ Users \ [USER] \ AppData \ Roaming \ [SOMEFOLDER]'而不是數據庫安裝目錄?這會回答#2。對於#1:使用板utils? – Herdo 2014-09-22 10:58:01

+0

謝謝@Herdo,我認爲這不是保存目錄的原因,因爲當我用新的替換.mdf文件並運行應用程序時,它顯示了第一個數據庫的內容而不是新的。我想知道是否有任何標準的方式來備份和恢復數據庫程序運行時,應用程序?! – 2014-09-22 12:07:17

+0

順便說一句,我發現我的第二個問題的答案,唯一剩下的問題是第一個問題。 – 2014-09-22 12:08:04

回答

3

這就是我所做的備份和我的LocalDB的恢復

public void BackupDatabase(string filePath) 
    { 
     using (TVend2014Entities dbEntities = new TVend2014Entities(BaseData.ConnectionString)) 
     { 
      string backupQuery = @"BACKUP DATABASE ""{0}"" TO DISK = N'{1}'"; 
      backupQuery = string.Format(backupQuery, "full databsase file path like C:\tempDb.mdf", filePath); 
      dbEntities.Database.SqlQuery<object>(backupQuery).ToList().FirstOrDefault(); 
     } 
    } 

    public void RestoreDatabase(string filePath) 
    { 
     using (TVend2014Entities dbEntities = new TVend2014Entities(BaseData.ConnectionString)) 
     { 
      string restoreQuery = @"USE [Master]; 
               ALTER DATABASE ""{0}"" SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
               RESTORE DATABASE ""{0}"" FROM DISK='{1}' WITH REPLACE; 
               ALTER DATABASE ""{0}"" SET MULTI_USER;"; 
      restoreQuery = string.Format(restoreQuery, "full db file path", filePath); 
      var list = dbEntities.Database.SqlQuery<object>(restoreQuery).ToList(); 
      var resut = list.FirstOrDefault(); 
     } 
    } 

希望這是你想要的。

+0

謝謝,爲了做這個項目,我使用ClosedXML將數據備份到Excel文件中,並從中恢復它們....但您的代碼似乎是做備份/恢復工作的好方法。我應該使用它。 – 2014-10-31 08:51:40

1

我有一段時間讓我的備份/恢復工作從我的應用程序中的代碼的bug。我正在使用LOCALDB,並希望確保無論數據庫的狀態或備份和恢復功能可以工作的.mdf文件的位置如何。畢竟 - 數據庫管理系統應該爲你處理這個問題。最後,這是我的備份和恢復功能的工作原理: 注意:VB中的代碼 - 保存「;」 :)

備份:

Dim cbdfilename As String = controlPath & "\Backup\Temp\cbdb.bak" 
    Dim connString As String = (server + ";Initial Catalog=master;Integrated Security=True;") 
    Dim conn As New SqlConnection(connString) 
    Dim sql As String 
    sql = "Backup database @DBNAME " _ 
    & " to Disk = @FILENAME" _ 
    & " with Format" 
    SqlConnection.ClearAllPools() 
    'execute backup 
    Dim dbcmd As New SqlCommand(sql, conn) 
    dbcmd.Parameters.AddWithValue("@DBNAME", database) 
    dbcmd.Parameters.AddWithValue("@FILENAME", cbdfilename) 
    conn.Open() 
    Try 
     dbcmd.ExecuteNonQuery() 
    Catch ex As Exception 
     MsgBox("Backup DB failed" + ex.ToString) 
    Finally 
     conn.Close() 
     conn.Dispose() 
    End Try 

上面需要注意的關鍵事情是SqlConnection.ClearAllPools()語句。儘管我確信所有連接都已經在我的應用程序的其他部分正確關閉並處理完畢 - 但不知怎的,DBMS仍顯示出一個開放的線程。

而現在的恢復:

SqlConnection.ClearAllPools() 
     Dim connString As String = (server + ";Initial Catalog=master;Integrated Security=True;") 
     Dim conn As New SqlConnection(connString) 
     Dim sql As String 
     sql = "Use master;" _ 
      & "Alter Database " & database & " Set Single_User With Rollback Immediate;" _ 
      & "Restore Database " & database & " From Disk = @FILENAME" _ 
      & " With Replace;" _ 
      & "Alter Database " & database & " Set Multi_User;" 

     'execute restore 
     Dim dbcmd As New SqlCommand(sql, conn) 
     dbcmd.Parameters.AddWithValue("@FILENAME", cbdfilename) 
     conn.Open() 
     Try 
      dbcmd.ExecuteNonQuery() 
     Catch ex As Exception 
      MsgBox("Restore DB failed" + ex.ToString) 
     Finally 
      conn.Close() 
      conn.Dispose() 
     End Try 

是什麼在上面的SQL非常奇怪的是,我最初嘗試使用@Parms數據庫名字,但ALTER語句將不接受他們。除特殊情況外,保持踢球。

我的還原和以前的解決方案之間最大的區別是我只使用數據庫名稱即。 「MyDB_TEST」,而不是我的Alter和Restore語句中的.mdf文件名。

相關問題