VB.Net не ловит хранимые процедуры raiserror

Кто-то уже сталкивался с этой ошибкой, как хранимая процедура вызывает ошибку, но клиент (vb.net) не перехватил ошибку?

Ниже мой код вызова хранимой процедуры от vb.net

Try

       Dim exec_refreshdependentviews As String = String.Format("EXEC REFRESHDEPENDENTVIEWS '{0}', '{1}', {2} ", tableName, usercode, isCreateNew)

       Using refreshCommand As New SqlClient.SqlCommand(exec_refreshdependentviews, DirectCast(sqlTransaction.Connection, SqlClient.SqlConnection), DirectCast(sqlTransaction, SqlClient.SqlTransaction))                  
               refreshCommand.ExecuteNonQuery()
       End Using
Catch exc As SqlClient.SqlException
        Throw New Exception("REFRESHDEPENDENTVIEWS", exc)
Catch ex As Exception
        Throw New Exception("REFRESHDEPENDENTVIEWS", ex)
End Try

Внутри хранимой процедуры я поднял ошибку, сообщение которой было от накопленной ошибки, обнаруженной внутри SP.

RAISERROR  (@Errors, 16, 1)

Обратите внимание, что @Errors имеет значение.

Когда я пытался запустить скрипт через бэкэнд, я вижу сообщение об ошибке на вкладке "Сообщение".

EXEC RefreshDependentViews 'CustomerSalesOrder', 'admin', 1 

Ниже приведено накопленное сообщение об ошибке.

Сообщение 50000, уровень 16, состояние 6, процедура RefreshDependentViews, строка 216 Неверное имя объекта 'dbo._Merged_SalesOrder_with_Details'. Сообщение 50000, уровень 16, состояние 1, процедура RefreshDependentViews, строка 216 Неверное имя объекта "Hips54.dbo.SupplierPurchaseReceiptDetailView". Сообщение 50000, уровень 16, состояние 1, процедура RefreshDependentViews, строка 299 Ошибка при запуске RefreshDependentViews CustomerSalesOrder: не удалось SP_REFRESHVIEW _Merged_SalesOrder_. Сообщение: неверное имя объекта 'dbo._Merged_SalesOrder_with_Details'. Ошибка при запуске RefreshDependentViews CustomerSalesOrder: не удалось SP_REFRESHVIEW _SOG_New. Сообщение: недопустимое имя объекта 'Hips54.dbo.SupplierPurchaseReceiptDetailView'.

Вышеуказанная ошибка не была перехвачена try-catch в vb.net. Как будто в моем SP нет ошибок

2 ответа

Я упростил ваш код, чтобы просто запросить исключение

Try
  Using refreshCommand As New SqlClient.SqlCommand("RAISERROR  ('test', 16, 1)", cn)
      refreshCommand.ExecuteNonQuery()
  End Using
Catch exc As SqlClient.SqlException
  Throw New Exception("REFRESHDEPENDENTVIEWS", exc)
Catch ex As Exception
  Throw New Exception("REFRESHDEPENDENTVIEWS", ex)
End Try

И это создает исключение, пойманное первым уловом, как и ожидалось. Так что, похоже, проблема в хранимой процедуре. Я хотел бы попытаться изменить серьезность (16 -> 20), чтобы подавить возможные перехваты в коде сервера.

Спасибо за ответы. Я нашел теперь виновника.

В моем коде я использую sqlTransaction в SqlClient.SqlCommand, что является причиной проблемы, почему raiserror не был перехвачен блоком try-catch.

Ниже был мой код, который вызывает проблему:

sqlTransaction = sqlConnection.BeginTransaction(IsolationLevel.ReadCommitted)
Me.RefreshDependentViews(connectionString, objectsToRefresh(i), m_UserCode)
sqlTransaction.Commit()

Мой код в хранимой процедуре

DECLARE @Errors NVARCHAR(MAX), @Error NVARCHAR(100)
BEGIN TRY              
    BEGIN TRANSACTION
    EXEC RefreshTableColletionOnView @TableName, @UserCode
    COMMIT TRANSACTION          
END TRY              
BEGIN CATCH
    ROLLBACK TRANSACTION;

    SET @Error = 'Warning: Failed to RefreshDataDictionaryColumn ' + @tablename
    IF @Errors IS NULL
        SET @Errors = @Error + '.' + CHAR(13) + 'Message: ' + ERROR_MESSAGE() 
    ELSE
        SET @Errors = @Errors + @Error + '.' + CHAR(13) + 'Message: ' + ERROR_MESSAGE()

END CATCH

IF @Errors IS NOT NULL
BEGIN
    RAISERROR (@Errors, 16, 1)              
END

Я не знаю причину, по которой @Errors пуст, когда SP вызывался через VB.Net, но если я запускаю его через MSSQL, @Errors имеет значение ошибки.

Другие вопросы по тегам