2010-06-06 69 views
-1

我正在使用下面的代码在VB.NET中恢复数据库。 这可以工作,但会导致界面锁定,如果用户点击任何东西。 另外,我不能让进度标签增量更新,它是空白,直到备份完成后则可以显示100%使用SMO恢复数据库 - 报告进度问题

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 
+0

顺便说一句,您可能想要编辑标题,因为您真正要问的是“如何在更新UI元素时避免'跨线程操作无效'错误”。这更有可能吸引知道答案的人注意他们的头顶。 – 2010-06-08 14:15:50

回答

0

您需要使用SqlRestoreAsyncSqlRestore以防止它捆绑您的主线程。

然后为了避免在更新UI时出现交叉线程操作错误,您可以使用the approach here。在窗体上创建方法的位置将更新UI元素,并使用Invoke从异步处理程序调用该方法。

+0

您好Martin,SqlRestoreAsync可以防止进度处理程序更新标签和进度条: 跨线程操作无效:控制'标签3'从其创建线程以外的线程访问。 – madlan 2010-06-06 14:54:29

+0

@madlan请参阅编辑。 – 2010-06-06 15:59:56

+0

上述更改是否正确? 我已经从进度事件处理程序子传递完成百分比的主UI线程上添加了一个更新子。 进度条似乎在恢复过程完成之前完成,标签根本没有更新。 – madlan 2010-06-06 16:24:18