繁体   English   中英

恢复 SQL 服务器 localdb 在 vb.net

[英]Restore SQL Server localdb in vb.net

我想恢复一个 SQL 服务器 localdb 数据库。 我试过这段代码:

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    Dim ofd As New OpenFileDialog() With
        {
            .Filter = "Backup file | *.bak",
            .FileName = ""
        }

    If ofd.ShowDialog = System.Windows.Forms.DialogResult.OK Then
            Cursor = Cursors.WaitCursor
            Dim csb = New SqlConnectionStringBuilder("Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\CHAKER\Documents\RestoDB.mdf;Integrated Security=True;Connect Timeout=30")
            Dim dbFullPath = csb.AttachDBFilename

            Dim sql = String.Format("RESTORE DATABASE ""{0}"" From DISK = '{1}'", dbFullPath, ofd.FileName)
            Dim cmd As New SqlCommand(sql, con)
            cmd.ExecuteNonQuery()
            MsgBox("Restore complete")
            Cursor = Cursors.Default

        End If

    End Sub

我得到这个例外:

RESTORE 无法处理数据库“C:\Users\CHAKER\Documents\RestoDB.mdf”,因为此 session 正在使用它。 建议在执行此操作时使用 master 数据库。

您的代码存在许多问题:

  • 您的主要问题:您正在按文件名恢复数据库,但您已经使用AttachDbFileName附加了它,并且无法恢复这样的数据库。 在任何情况下都不推荐使用AttachDbFileName 您应该使用普通的CREATE DATABASE FOR ATTACH语法将其附加到 LocalDB。
  • 最好不要对连接字符串进行硬编码,而是将其存储在设置文件中。
  • 您需要Using来处理您的连接和命令对象。 不要缓存连接 object。
  • 连接打开时不要使用 MessageBox 阻塞线程
  • 您应该在RESTORE命令上使用参数化,而不是直接注入名称
In settings file:
ConnectionString "Data Source=(LocalDB)\v11.0;Initial Catalog=RestoDB;Integrated Security=True;Connect Timeout=30"
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    Dim ofd As New OpenFileDialog() With
        {
            .Filter = "Backup file | *.bak",
            .FileName = ""
        }

    If ofd.ShowDialog <> System.Windows.Forms.DialogResult.OK Then Exit Sub

    Try
        Cursor = Cursors.WaitCursor
        Const sql = "RESTORE DATABASE @DB From DISK = @FileName"
        Using con As New SqlConnection(Properties.ConnectionString),
              cmd As New SqlCommand(sql, con)
            cmd.Parameters.Add("@DB", SqlDbType.NVarChar, 128).Value = con.Database
            cmd.Parameters.Add("@FileName", SqlDbType.NVarChar, 255).Value = ofd.FileName
            cmd.ExecuteNonQuery()
        End Using
        MsgBox("Restore complete")
    End Try
    Catch ex As Exception
        MsgBox("Error: " + ex.Message)
    End Catch
    Finally
        Cursor = Cursors.Default
    End Finally

End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM