Есть SQL Server 2000. Пишу команды для рестора на нем БД. Так как рестор проходит в асинхронном режиме, то для отлова события завершения рестора использую перехват событий. А именно событие ExecuteComplete.
Проблема в том, что событие завершения наступает гораздо раньше, чем БД реально отресторена на сервере. Через ЕМ видно, что она ресторится, в том числе и через "текущую активность".
При этом, после того, как проходит последнее событие завершения команды рестора (ресториться могут одновременно несколько БД), программа подвисает, несмотря на асихронный режим работы. Висит до окончания рестора последней БД.
Сделал аналогичную процедуру рестора, но только в синхронном режиме - та же история. События происходят раньше. Только интерфейс висит постоянно ибо синхронный режим.
Подскажите, как отловить "правильное" событие? Где-то накосячил...
Код следующий (не нужные места вырезаны) - помечены "....."
- Код: Выделить всё
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