使用VB.NET

时间:2015-10-10 07:22:57

标签: vb.net visual-studio-2013 localdb database-restore sql-server-2012-localdb

我有一个用VB.NET和SQL Server 2012 LocalDB(v11)开发的项目,我需要在我的应用程序中备份/恢复工具。备份部分已完成,但我遇到了恢复部分。这是我想要工作的查询(并且它在SQL编辑器中正常工作)

ALTER DATABASE [<.MDF File Path>] 
SET SINGLE_USER WITH ROLLBACK IMMEDIATE

RESTORE DATABASE [<.MDF File Path] FROM DISK='<.bak File Path'

这是我试图执行的VB.NET中的代码

Sub Restorequery(ByVal que As String)
    MainForm.Conn.Close()
    con = New SqlConnection("Data Source=(LocalDB)\v11.0;Database=Master;integrated security=True;")
    If Not con.State = ConnectionState.Open Then con.Open()
    cmd = New SqlCommand(que, con)
    cmd.ExecuteNonQuery()
End Sub

以下是我到目前为止尝试的方法

  1. 使用与上述相同的查询

    Restorequery("ALTER DATABASE [<.MDF File Path>] SET SINGLE_USER WITH ROLLBACK IMMEDIATE")
    Restorequery("restore database [<.MDF File Path>] from disk='<.bak File Path>'")
    

    ,这会导致错误

      

    由于数据库正在使用,无法获得独占访问权限。 RESTORE DATABASE异常终止。

  2. 在找到上述问题的原因后(即使在使用master数据库打开连接并使用MainForm.Conn.Close()关闭所有先前打开的连接时也是无意义),我尝试了第二种方法Stackoverflow的链接和引用。这是我试过的查询:

    Restorequery("use [master] ")
    Restorequery("alter database [<.MDF File Name>] set single_user with rollback immediate")
    Restorequery("restore database[<.MDF File Name>] from disk='<.bak File Name>'")
    Restorequery("alter database [<.MDF File Name>] set multi_user")
    Restorequery("use [<.MDF File Name>]")
    

    这是我在执行第二次查询时遇到的错误:

      

    其他信息:用户无权使用路径&gt;更改数据库&lt; .MDF文件名,数据库不存在,或者数据库未处于允许访问检查的状态。 ALTER DATABASE语句失败。

  3. 还有其他方法可以使用VB.NET恢复SQL Server LocalDB吗?

1 个答案:

答案 0 :(得分:1)

我在我的一个项目中使用过这段代码。

Try 
     With OpenFileDialog1
            .Filter = ("DB Backup File|*.bak;")
            .FilterIndex = 4
     End With

     OpenFileDialog1.FileName = ""

     If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
          Cursor = Cursors.WaitCursor
          SqlConnection.ClearAllPools()
          con = New SqlConnection(cs)
          con.Open()
          Dim cb As String = "USE Master ALTER DATABASE [" & System.Windows.Forms.Application.StartupPath & "\BRH.mdf] SET Single_User WITH Rollback Immediate Restore database [" & System.Windows.Forms.Application.StartupPath & "\BRH.mdf] FROM disk='" & OpenFileDialog1.FileName & "' WITH REPLACE ALTER DATABASE [" & System.Windows.Forms.Application.StartupPath & "\BRH.mdf] SET Multi_User "
          cmd = New SqlCommand(cb)
          cmd.Connection = con
          cmd.ExecuteReader()
          con.Close()
    End If
Catch ex As Exception
    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try