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

时间:2014-09-22 04:52:17

标签: c# sql wpf entity-framework 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
  1. 我应该如何备份/恢复数据库?
  2. 如何通过ClickOnce进一步更新来保护数据库安全?
  3. 非常感谢:)

2 个答案:

答案 0 :(得分:6)

这就是我为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();
        }
    }

希望这就是你想要的。

答案 1 :(得分:1)

我有一个错误的时间让我的备份/恢复工作从我的应用程序中的代码。我正在使用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语句不接受它们。保持与例外的反击。

我的恢复和早期解决方案之间的最大区别是我只使用数据库名称即。 “MyDB_TEST”,而不是我的Alter和Restore语句中的.mdf文件名。