Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 |

 

  Вопрос: Событие ExecuteCompete - проблема Добавлено: 10.07.09 00:41  

Автор вопроса:  Phoenix | ICQ: 233871569 
Проблема следующая.
Есть 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

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 Phoenix



ICQ: 233871569 

Вопросов: 3
Ответов: 4
 Профиль | | #1 Добавлено: 11.07.09 01:09
Еще уточнение
После того, как проходит последнее событие завершения команды рестора (ресториться могут одновременно несколько БД), программа подвисает, несмотря на асихронный режим работы. Висит до окончания рестора последней БД.

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

Ответить

Номер ответа: 2
Автор ответа:
 Phoenix



ICQ: 233871569 

Вопросов: 3
Ответов: 4
 Профиль | | #2 Добавлено: 11.07.09 15:35
Проблема решена
Нужно было изменить курсор с серверного (по дефлоту) на клиентский.

adoConnection.CursorLocation = adUseClient

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам