我有一段时间让我的备份/恢复工作从我的应用程序中的代码的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