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 имеет значение ошибки.