Public Class BackupDatabase Public cDatabase As String = "" Public cDatabaseBackupSynchronizationDirectory As String = "" Public cPath As String = "" Public cWinZipDirectory As String = "C:\Program Files\WinZip" Public cWinZipEXE As String = "WinZip32.exe" Public lCompression As Boolean = True Public lDatabaseBackupSynchronization As Boolean = False Public lDatabaseShrink As Boolean = False Public lDatabaseShrinkLog As Boolean = False Public lInit As Boolean = True Public lSequence As Boolean = False Public lWinZip As Boolean = False Public lZip As Boolean = False Public oOriginator As Robot = Nothing Public oStatus As Object = Nothing Private nNoLanguage As Integer = 0 Private oApp As App = Nothing Private oProcess As LXProcess = Nothing ' This is when we access the class in a desktop mode Sub New(ByVal toApplication As App) oApp = toApplication nNoLanguage = oApp.nLanguage End Sub ' This is when we access the class in a Web mode Sub New(ByVal toProcess As LXProcess) oProcess = toProcess oApp = oProcess.oApp nNoLanguage = oProcess.nLanguage End Sub Public Function Backup() As Boolean Dim lcBackingUpDatabase As String = "" Dim lcScript As String = "" Dim lcSequence As String = "" Dim lcZippingTheBackup As String = "" Dim lnSequence As Integer = 0 Dim loBackup As Microsoft.SqlServer.Management.Smo.Backup = New Microsoft.SqlServer.Management.Smo.Backup Dim loData As Data = New Data(oApp) Dim loFileFunction As FileFunction = New FileFunction(oApp) Dim loServer As Microsoft.SqlServer.Management.Smo.Server = New Microsoft.SqlServer.Management.Smo.Server Dim loZip As Zip = Nothing ' Get the proper definition as per the current scope If oProcess Is Nothing Then loZip = New Zip(oApp) Else loZip = New Zip(oProcess) End If ' Based on the language Select Case nNoLanguage ' English Case 1 lcBackingUpDatabase = "Backing up database" lcZippingTheBackup = "Zipping the backup" ' French Case 2 lcBackingUpDatabase = "Prise de copie de la base de données" lcZippingTheBackup = "Compression de la prise de copie de la base de données" ' Spanish Case 3 lcBackingUpDatabase = "Backing up database" lcZippingTheBackup = "Zipping the backup" ' Portuguese Case 4 lcBackingUpDatabase = "Backing up database" lcZippingTheBackup = "Zipping the backup" End Select ' If we shrink the database If lDatabaseShrink Then oOriginator.AddStatus("Shrinking database...") ' Create the fields lcScript = lcScript + "DBCC ShrinkFile (" + cDatabase + ",1)" + oApp.cCR If Not loData.ExecuteSQLScript(lcScript) Then Return False End If End If ' If we shrink the database log If lDatabaseShrinkLog Then oOriginator.AddStatus("Shrinking database log...") ' Create the fields lcScript = lcScript + "DBCC ShrinkFile (" + cDatabase + "_Log,1)" + oApp.cCR If Not loData.ExecuteSQLScript(lcScript) Then Return False End If End If oOriginator.AddStatus(lcBackingUpDatabase + "...") loBackup.Devices.AddDevice(cPath + "\" + cDatabase + ".bak", Microsoft.SqlServer.Management.Smo.DeviceType.File) loBackup.Database = cDatabase loBackup.Action = Microsoft.SqlServer.Management.Smo.BackupActionType.Database loBackup.Initialize = True loBackup.PercentCompleteNotification = 1 ' If we use the compression If lCompression Then loBackup.CompressionOption = Microsoft.SqlServer.Management.Smo.BackupCompressionOptions.On End If ' If we create a new archive If lInit Then loBackup.Initialize = True End If AddHandler loBackup.PercentComplete, AddressOf ProgressEventHandler loBackup.SqlBackup(loServer) ' If we have to zip If lZip Then oOriginator.AddStatus(lcZippingTheBackup + "...") ' Zip the .bak file so it would be ready to be downloaded loZip.cSourceFolder = cPath loZip.AddFile(cDatabase + ".bak") loZip.cDestinationFile = cPath + "\" + cDatabase + ".zip" loZip.cWinZipDirectory = cWinZipDirectory loZip.cWinZipEXE = cWinZipEXE ' If we use WinZip If lWinZip Then loZip.cSourceFolder = cPath + "\" + cDatabase + ".bak" End If If Not loZip.Zip() Then ' Get the proper definition as per the current scope If oProcess Is Nothing Then oApp.ErrorSetup(, loZip.cMessage) Else oProcess.ErrorSetup(, loZip.cMessage) End If End If End If ' If we synchronize the backup to another server If lDatabaseBackupSynchronization Then oOriginator.AddStatus("Copying " + cDatabase + ".bak...") ' If we use a sequence If lSequence Then ' Just so we can have at least two backups at the same time lnSequence = Date.Now.DayOfWeek Mod 2 lcSequence = lnSequence.ToString End If ' Zip class needs an extension, otherwise, it will try to zip a file name ending with .zip loFileFunction.cSource = cPath + "\" + cDatabase + ".bak" loFileFunction.cDestination = cDatabaseBackupSynchronizationDirectory + "\" + cDatabase + lcSequence + ".bak" If loFileFunction.CopyFile() Then End If End If Return True End Function Private Sub ProgressEventHandler(ByVal sender As Object, ByVal e As Microsoft.SqlServer.Management.Smo.PercentCompleteEventArgs) oOriginator.AddStatus("Backing up database: " + e.Percent.ToString + "% completed...") System.Windows.Forms.Application.DoEvents() End Sub Public Function Restore() As Boolean Dim lcRestoringDatabase As String = "" Dim loRestore As Microsoft.SqlServer.Management.Smo.Restore = New Microsoft.SqlServer.Management.Smo.Restore Dim loServer As Microsoft.SqlServer.Management.Smo.Server = New Microsoft.SqlServer.Management.Smo.Server ' Based on the language Select Case nNoLanguage ' English Case 1 lcRestoringDatabase = "Restoring database" ' French Case 2 lcRestoringDatabase = "Restore de la base de données" ' Spanish Case 3 lcRestoringDatabase = "Restoring database" ' Portuguese Case 4 lcRestoringDatabase = "Restoring database" End Select oStatus.Text = lcRestoringDatabase + "..." loRestore.Devices.AddDevice(cPath + "\" + cDatabase + ".bak", Microsoft.SqlServer.Management.Smo.DeviceType.File) loRestore.Database = cDatabase loRestore.Action = Microsoft.SqlServer.Management.Smo.RestoreActionType.Database loRestore.ReplaceDatabase = True loRestore.PercentCompleteNotification = 1 AddHandler loRestore.PercentComplete, AddressOf ProgressEventHandler2 loRestore.SqlRestore(loServer) Return True End Function Private Sub ProgressEventHandler2(ByVal sender As Object, ByVal e As Microsoft.SqlServer.Management.Smo.PercentCompleteEventArgs) oStatus.Text = "Restoring database: " + e.Percent.ToString + "% completed..." System.Windows.Forms.Application.DoEvents() End Sub End Class