WPF – 如何以编程方式备份​​/还原LocalDB – ClickOnce

我有一个应用程序使用EF和LocalDB作为它的数据库,由ClickOnce发布。 这是我第一次使用LocalDB,我不知道如何添加一个function到我的应用程序以编程方式备份​​/恢复数据库。

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进一步更新来保护数据库安全?

非常感谢 :)

这是我为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(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(restoreQuery).ToList(); var resut = list.FirstOrDefault(); } } 

希望这是你想要的。

我有一个错误的时间让我的备份/恢复工作从我的应用程序中的代码。 我正在使用LOCALDB,并希望确保无论数据库的状态或.mdf文件的位置,备份和还原function都可以工作。 毕竟 – DBMS应该为您解决这个问题。 最后,这是我的备份和恢复function的工作方式:注意: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文件名。