Проблема следующая.
Есть SQL Server 2000. Пишу команды для рестора на нем БД. Так как рестор проходит в асинхронном режиме, то для отлова события завершения рестора использую перехват событий. А именно событие ExecuteComplite.
Проблема в том, что событие завершения настпуает гораздо раньше, чем БД реально отрксторена на сервере. Через ЕМ видно, что она ресторится, в том чисое и через "текущую активность".
Подскажите, как отлавить "правильное" событие? Мож где-то ручками накосячил.
Код следующий (не нужные места вырезаны) - помечены "....."
Private WithEvents adoConnection As ADODB.Connection
Dim adoCmd() As New ADODB.Command
Dim adoCmdCount As Integer
.....
Private Sub adoConnection_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, _
adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, _
ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
Dim blNoErr As Boolean
Dim strCommandText As String
Dim strBDKName As String
Debug.Print Time
Debug.Print pCommand.CommandText
strCommandText = pCommand.CommandText
strBDKName = Mid$(pCommand.CommandText, InStr(1, pCommand.CommandText, "Tax_Cont"))
strBDKName = Left$(pCommand.CommandText, InStr(1, pCommand.CommandText, "FROM DISK") - 1)
Select Case adStatus
Case ADODB.EventStatusEnum.adStatusOK
If pError Is Nothing Then
Debug.Print "База отресторена"
blNoErr = True
Else
Debug.Print "Произошла ошибка" & vbNewLine & pError.Description
adoErrorDesc = adoErrorDesc & vbNewLine & strBDKName & "- " & pError.Description
blNoErr = False
End If
Case ADODB.EventStatusEnum.adStatusErrorsOccurred
If Not pError Is Nothing Then
Debug.Print "В процессе выполнения произошла ошибка." & vbNewLine & pError.Description
blNoErr = False
adoErrorDesc = adoErrorDesc & vbNewLine & strBDKName & "- " & pError.Description
End If
Case ADODB.EventStatusEnum.adStatusCancel
Debug.Print "Отменено." & vbNewLine & pError.Description
blNoErr = False
adoErrorDesc = adoErrorDesc & vbNewLine & strBDKName & "- " & pError.Description
End Select
.....
' Следующий кусок кода выполняется, когда по всем запущенным командам рестора, произошло событие завершения
If adoErrorDesc <> "" Then
MsgBox "В процессе рестора БД были следующие ошибки:" & adoErrorDesc, vbOKOnly + vbExclamation, "Предупреждение"
Else
MsgBox "Все базы отресторены", vbOKOnly + vbInformation, "Сообщение"
End If
adoConnection.Close
End If
End Sub
.....
Private Sub StartRestore ()
.....
Set adoConnection = New ADODB.Connection '@@@
strConnect = "Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=" & cm.strServerName
adoConnection.CommandTimeout = 1800
adoConnection.Open strConnect
.....
'В цикле вызываю процедуру асинхронного выполнения команд
Call RestoreEtalonAsync(idx)
.....
End Sub
Private Sub RestoreEtalonAsync(idx As Integer)
Dim strBDKName As String
Dim strFullBDKPath As String
Dim strFailedPath As String
' Формирую имя БД
strBDKName = "BDK_" & BDK(2, idx) & "_" & BDK(0, idx) & "_" & BDK(3, idx)
' Формирую каталог для размещения файлов БД
strFullBDKPath = cm.strPathBDK & "I" & BDK(2, idx) & "_" & BDK(0, idx) & "_" & BDK(3, idx) & "\"
If DirIsExist(strFullBDKPath, strFailedPath) = False Then MkDir (strFullBDKPath)
'Формирую строку SQL-командой
BDK(4, idx) = "RESTORE DATABASE " & strBDKName & " FROM DISK = N'" & cm.strEtBDK & "' WITH FILE = 1, NOUNLOAD , STATS = 10, RECOVERY, REPLACE, MOVE N'" & cm.strLogicMDFName & "' TO N'" & strFullBDKPath & strBDKName & ".mdf', MOVE N'" & cm.strLogicLDFName & "' TO N'" & strFullBDKPath & strBDKName & "_log.ldf'"
adoCmdCount = adoCmdCount + 1
ReDim Preserve adoCmd(0 To adoCmdCount) As New ADODB.Command
With adoCmd(adoCmdCount)
.CommandText = BDK(4, idx)
.CommandType = adCmdUnknown
.CommandTimeout = 1800
Set .ActiveConnection = adoConnection
.Execute , , adAsyncExecute
End With
' Флаг того, что по данной БД запущен рестор
BDK(5, idx) = 1
End Sub
Ответить
|