Событие ExecuteCompete - проблема

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
metall_2000
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 25.08.2003 (Пн) 17:37
Откуда: Москва

Событие ExecuteCompete - проблема

Сообщение metall_2000 » 09.07.2009 (Чт) 20:56

Проблема следующая.
Есть SQL Server 2000. Пишу команды для рестора на нем БД. Так как рестор проходит в асинхронном режиме, то для отлова события завершения рестора использую перехват событий. А именно событие ExecuteComplete.

Проблема в том, что событие завершения наступает гораздо раньше, чем БД реально отресторена на сервере. Через ЕМ видно, что она ресторится, в том числе и через "текущую активность".

При этом, после того, как проходит последнее событие завершения команды рестора (ресториться могут одновременно несколько БД), программа подвисает, несмотря на асихронный режим работы. Висит до окончания рестора последней БД.

Сделал аналогичную процедуру рестора, но только в синхронном режиме - та же история. События происходят раньше. Только интерфейс висит постоянно ибо синхронный режим.

Подскажите, как отловить "правильное" событие? Где-то накосячил... :D
Код следующий (не нужные места вырезаны) - помечены "....."

Код: Выделить всё
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

metall_2000
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 25.08.2003 (Пн) 17:37
Откуда: Москва

Re: Событие ExecuteCompete - проблема

Сообщение metall_2000 » 11.07.2009 (Сб) 14:33

Проблема решена
Нужно было изменить курсор с серверного (по дефлоту) на клиентский.
Код: Выделить всё
adoConnection.CursorLocation = adUseClient


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList