SSIS Script Task supress onerror
У меня есть сценарий, который загружает файл, используя объект подключения HTTP. Эта задача скрипта является частью пакета, который вызывается другим пакетом. Иногда соединение не может быть установлено. В этих случаях я хочу повторить попытку подключения несколько раз, прежде чем, наконец, выдаст ошибку, если попытки подключения потерпят неудачу.
Я пытался реализовать это. Оказалось, работает, и задача не терпит неудачу. Однако событие OnError по-прежнему распространяется каждый раз, когда возникает исключение в задаче сценария, даже если задача сценария не завершается с ошибкой. Ошибка происходит, когда управление передается из дочернего пакета обратно в родительский пакет.
Public Sub Main()
Dim tryTimes As Integer = 0
Dim maxTimes As Integer = 4
While (True)
Try
Dim nativeObject As Object = Dts.Connections("HTTP Connection Manager").AcquireConnection(Nothing)
'Create a new HTTP client connection
Dim connection As New HttpClientConnection(nativeObject)
Dim filename As String = Dts.Variables("Working_File").Value
connection.DownloadFile(filename, True)
Dts.TaskResult = ScriptResults.Success
Exit While
Catch ex As Exception
If (tryTimes < maxTimes) Then
tryTimes = tryTimes + 1
Thread.Sleep(30000)
Else
MsgBox(ex.Message)
Dts.TaskResult = ScriptResults.Failure
Throw
End If
End Try
End While
End Sub
Я надеюсь получить решение, при котором событие OnError не вызывается, если попытка подключения не удалась определенное количество раз.
2 ответа
Вы захотите использовать метку вне попытки и GoTo в вашем улове
Public Sub Main()
Dim tryTimes As Integer = 0
Dim maxTimes As Integer = 4
RunCode: 'Label here
While (True)
Try
'your code here
Exit While
Catch ex As Exception
If (tryTimes < maxTimes) Then
tryTimes = tryTimes + 1
Thread.Sleep(30000)
GoTo RunCode 'after we catch the exception and eval tryTimes go back and retry
Else
'MsgBox(ex.Message)
Dts.Events.FireError(-1, "", "Error message: " & ex.ToString(), "", 0)
Dts.TaskResult = ScriptResults.Failure
'Throw
End If
End Try
End While
End Sub
Попробуйте написать один и тот же код: "Запустите предупреждение" на первых 4 пробах, а на пятых пробах выдает ошибку, я не уверен, будет ли она работать:
Public Sub Main()
Dim tryTimes As Integer = 0
Dim maxTimes As Integer = 4
While (True)
Try
Dim nativeObject As Object = Dts.Connections("HTTP Connection Manager").AcquireConnection(Nothing)
'Create a new HTTP client connection
Dim connection As New HttpClientConnection(nativeObject)
Dim filename As String = Dts.Variables("Working_File").Value
connection.DownloadFile(filename, True)
Dts.TaskResult = ScriptResults.Success
Exit While
Catch ex As Exception
If (tryTimes < maxTimes) Then
tryTimes = tryTimes + 1
Dts.Events.FireWarning(0, "Error ignored", _
"Retrying in 30 seconds", String.Empty, 0)
Thread.Sleep(30000)
Else
Dts.Events.FireError(-1, "", "Error message: " & ex2.ToString(), "", 0)
Dts.TaskResult = ScriptResults.Failure
End If
End Try
End While
End Sub
Ссылка