是否有人已经遇到此错误,例如存储过程引发错误,但客户端(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
下面是累积的错误消息。
Msg 50000,级别 16,状态 6,过程刷新相关视图,行 216 無位的物體名稱「dbo._Merged_SalesOrder_with_Details」。味精 50000,级别 16,状态 1,过程刷新相关视图,第 216 行 无效的对象名称"Hips54.dbo.SupplierPurchaseReceiptDetailView"。 消息 50000,级别 16,状态 1,过程刷新相关视图,行 299 运行刷新相关视图客户销售订单时出错:无法 SP_REFRESHVIEW _Merged_SalesOrder_。消息:对象名称无效 "dbo._Merged_SalesOrder_with_Details"。运行时出错 刷新相关视图客户销售订单:无法SP_REFRESHVIEW _SOG_New。消息:无效的对象名称"Hips54.dbo.SupplierPurchaseReceiptDetailView"。
上述错误未被 vb.net 中的 try-catch 捕获。就像我的SP中没有引发错误
我已经简化了你的代码,只查询表达式
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) 以提供服务器代码中可能的捕获。
感谢您的回复。我现在找到了罪魁祸首。
在我的代码中,我在 SqlClient.SqlCommand 中使用了 sqlTransaction,这是导致 try-catch 块没有捕获 raiserror 的原因。
以下是导致问题的我的代码:
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
我不知道为什么当通过 VB.Net 调用 SP 时@Errors为空的原因,但是如果我通过 MSSQL 运行它,@Errors就会出现错误值。