【问题标题】:Code has no errors, but it's not restoring the database代码没有错误,但它没有恢复数据库
【发布时间】:2018-01-15 15:15:26
【问题描述】:

这是我的vb.net恢复SQL Server数据库的代码,我认为代码没有包含错误,所以执行代码时似乎没有错误,但并没有恢复数据库。

请帮我找出错误。我在网上搜索了很多,但没有找到任何解决问题的方法。

Sub restore_db()
    Dim con As New SqlConnection("Data Source=HP;Database=Master;integrated security=SSPI;")
    con.Open()
    Dim filename As String
    Dim strQuery As String

    Dim objdlg As New OpenFileDialog
    objdlg.FileName = "service_station"
    objdlg.Filter = "SQL Server database backup files|*.bak"
    objdlg.ShowDialog()

    filename = objdlg.FileName

    strQuery = "ALTER DATABASE service_station set SINGLE_USER WITH ROLLBACK IMMEDIATE"
    strQuery = "RESTORE DATABASE service_station FROM disk='" & filename & "' WITH REPLACE,RECOVERY"
    strQuery = "ALTER DATABASE service_station SET MULTI_USER WITH ROLLBACK IMMEDIATE"

    Dim cmd As SqlCommand
    cmd = New SqlCommand(strQuery, con)

    cmd.ExecuteNonQuery()
    con.Close()
End Sub

【问题讨论】:

  • 不相关:“查询”而不是“Quary”
  • 您正在执行的唯一“Quary”是ALTER DATABASE service_station SET MULTI_USER WITH ROLLBACK IMMEDIATE。您正在设置并覆盖 3 条不同行上的查询值,然后执行“quary”的值。猜测一下,您应该连接strQuary 的值。再说一遍,它的拼写是“Query”。
  • @Larnu 好吧,它是 spelled 查询 ;)
  • 您为什么还要考虑从 vb.net 恢复数据库?这对我来说似乎是一件非常危险的事情。我不希望任何外部应用程序对我的数据库执行此操作,因为我不想为任何外部应用程序授予管理员权限。
  • @HLGEM 应用程序可以使用受信任的连接,使用打开应用程序的用户的凭据。因此,OP 可能不一定会授予应用程序访问权限(因为应用程序本身实际上没有权限)。

标签: sql-server database vb.net


【解决方案1】:

你不断覆盖查询值:

strQuery = "ALTER DATABASE ..."
strQuery = "RESTORE DATABASE ..."
strQuery = "ALTER DATABASE ..."

将导致strQuery 值仅包含最后一个字符串。相反,您需要执行以下操作:

' First query
strQuery = "ALTER DATABASE ..."
Dim cmd As SqlCommand = New SqlCommand(strQuery, con)
cmd.ExecuteNonQuery()

' Second query
strQuery = "RESTORE DATABASE ..."
cmd = New SqlCommand(strQuery, con)
cmd.ExecuteNonQuery()

' Third query
strQuery = "ALTER DATABASE ..."
cmd = New SqlCommand(strQuery, con)
cmd.ExecuteNonQuery()

【讨论】:

  • 个人认为单批运行会更好。否则,您可能会将数据库更改为 SINGLE USER,然后,在一个命令和下一个命令之间的那一瞬间,其他东西会使用该单个连接。
  • @Larnu 虽然它使用相同的连接,但没有发生断开和重新连接。
  • 不要用拼写错误的名字让未来的同事发疯。让它成为 strQuery。
  • @HLGEM 确实如此,但人们已经在 cmets 中指出了这一点。
  • @DavidG 是的;我只是从不相信任何东西来确保它在命令之间保持连接。单个批次只是减轻了这种(微小的)可能性。我不是说你的答案是错误的,这只是个人喜好。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
相关资源
最近更新 更多