I’m trying to move some code into some class files to clean up my code. One area I’m having trouble with is reporting progress for events between the object performing the task and a progress bar.
I guess the event functions have to be placed in the new class but they also need to update the progress bar on the calling form? Can the class\object return updates in place of the event handlers?
Currently the form has all the code:
Function DoRestore(ByVal SQLServer As String, ByVal BackupFilePath As String, ByVal DatabaseName As String)
Dim Server As Server = New Server(SQLServer)
Server.ConnectionContext.ApplicationName = Application.ProductName
Dim res As Restore = New Restore()
Dim dt As DataTable
res.Devices.AddDevice(BackupFilePath, DeviceType.File)
dt = res.ReadFileList(Server)
res.Database = DatabaseName
res.PercentCompleteNotification = 1
AddHandler res.PercentComplete, AddressOf RestoreProgressEventHandler
AddHandler res.Complete, AddressOf RestoreCompleteEventHandler
res.SqlRestoreAsync(Server)
While res.AsyncStatus.ExecutionStatus = ExecutionStatus.InProgress
Application.DoEvents()
End While
End Function
Private Function RestoreProgressEventHandler(ByVal sender As Object, ByVal e As PercentCompleteEventArgs)
'Update progress bar (e.Percent)
End Function
Private Sub RestoreCompleteEventHandler(ByVal sender As Object, ByVal e As Microsoft.SqlServer.Management.Common.ServerMessageEventArgs)
'Signal completion
End Sub
Used via:
DoRestore(SQLServer, "C:\SQLBACKUP.bak", DatabaseName)
You should be defining an event in your class and handling the progress bar update in the form (assuming WinForms?) – the point here is that the class is concerned with backing up something – it shouldn’t have any concept of progress bars:
Define the event in the class:
Raise this event as required when doing the backup:
In the calling code you either need to
Define a class using
WithEvents:and then act on the event:
Or add a handler manually: