我有一段時間讓我的備份/恢復工作從我的應用程序中的代碼的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文件名。
如何將數據保存到'C:\ Users \ [USER] \ AppData \ Roaming \ [SOMEFOLDER]'而不是數據庫安裝目錄?這會回答#2。對於#1:使用板utils? – Herdo 2014-09-22 10:58:01
謝謝@Herdo,我認爲這不是保存目錄的原因,因爲當我用新的替換.mdf文件並運行應用程序時,它顯示了第一個數據庫的內容而不是新的。我想知道是否有任何標準的方式來備份和恢復數據庫程序運行時,應用程序?! – 2014-09-22 12:07:17
順便說一句,我發現我的第二個問題的答案,唯一剩下的問題是第一個問題。 – 2014-09-22 12:08:04