2014-09-22 83 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文件名。