【问题标题】:Restoring database with SMO - Reporting progress problems使用 SMO 恢复数据库 - 报告进度问题
【发布时间】:2010-06-06 13:37:48
【问题描述】:

我正在使用以下内容在 VB.NET 中恢复数据库。 这可行,但如果用户单击任何内容,则会导致界面锁定。 另外,我无法让进度标签增量更新,它是空白的,直到备份完成然后显示 100%

Sub DoRestore()
    Dim svr As Server = New Server("Server\SQL2008")
    Dim res As Restore = New Restore()
    res.Devices.AddDevice("C:\MyDB.bak", DeviceType.File)
    res.Database = "MyDB"
    res.RelocateFiles.Add(New RelocateFile("MyDB_Data", "C:\MyDB.mdf"))
    res.RelocateFiles.Add(New RelocateFile("MyDB_Log", "C:\MyDB.ldf"))
    res.PercentCompleteNotification = 1
    AddHandler res.PercentComplete, AddressOf ProgressEventHandler
    res.SqlRestore(svr)
End Sub

这个改动正确吗?:

Private Sub ProgressEventHandler(ByVal sender As Object, ByVal e As PercentCompleteEventArgs)
    UpdateProgressBar(e.Percent)
End Sub

Private Sub UpdateProgressBar(ByVal e As String)
    ProgressBar.Value = e
    Status.Text = e.ToString
End Sub

【问题讨论】:

  • 顺便说一句,您可能想编辑此标题,因为您真正要问的是“如何在更新 UI 元素时避免'跨线程操作无效'错误” .这更有可能吸引那些知道答案的人的注意力。

标签: sql-server vb.net multithreading smo


【解决方案1】:

您需要使用SqlRestoreAsync 而不是SqlRestore 来防止它占用您的主线程。

为了避免在更新 UI 时出现跨线程操作错误,您可以使用the approach here。您在表单上创建一个方法,该方法将更新 UI 元素并使用 Invoke 从您的异步处理程序中调用它。

【讨论】:

  • 嗨 Martin,SqlRestoreAsync 阻止进度处理程序更新标签和进度条:跨线程操作无效:控件“Label3”从创建它的线程以外的线程访问。
  • 以上改动是否正确?我在主 UI 线程上添加了一个更新子,它从进度事件处理程序子传递完成百分比。进度条似乎在恢复过程完成之前就完成了,并且标签根本没有更新。
  • 不,我认为这不对,但我很惊讶它没有给你任何错误。我以为你必须使用Invokebackgroundworker。这不是我从头顶上知道的事情。也许看看这个看起来和你很相似的项目shabdar.org/sql-server-backup-utility.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
相关资源
最近更新 更多