[英]WPF - How to Backup / Restore LocalDB Programmatically - ClickOnce
我有一個應用程序使用EF和LocalDB作為它的數據庫,由ClickOnce發布。 這是我第一次使用LocalDB,我不知道如何添加一個功能到我的應用程序以編程方式備份/恢復數據庫。
我的應用程序路徑由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
非常感謝 :)
這就是我為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();
}
}
希望這是你想要的。
我有一次很麻煩的事情,需要從應用程序中的代碼開始進行備份/還原。 我正在使用LOCALDB,並希望確保無論數據庫的狀態或.mdf文件的位置,備份和還原功能都可以工作。 畢竟 - DBMS應該為您解決這個問題。 最后,這是我的備份和恢復功能的工作方式:注意: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語句不接受它們。 保持與例外的反擊。
我的還原與先前解決方案中還原的最大區別在於,我僅使用數據庫名稱,即。 在我的Alter和Restore語句中,“ MyDB_TEST”而不是.mdf文件名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.