是否有人已经遇到此错误,例如存储过程引发错误但客户端(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,Level 16,State 6,Procedure RefreshDependentViews,Line 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'。
上述错误未被vb.net中的try-catch捕获。这就像我的SP中没有出现错误
答案 0 :(得分:0)
我已将代码简化为仅查询exeption
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)以支持服务器代码中的可能捕获。
答案 1 :(得分:0)
感谢您的回复。我现在找到了罪魁祸首。
在我的代码中,我在SqlClient.SqlCommand中使用了sqlTransaction,这就是为什么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
当通过VB.Net调用SP时,我不知道为什么@Errors为空,但如果我通过MSSQL运行它,则@Errors有错误值。