0

是否有人已经遇到过此错误,例如存储过程引发错误但客户端(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”。

上面的错误没有被 vb.net 中的 try-catch 捕获。就像我的 SP 中没有引发错误一样

4

2 回答 2

0

我已将您的代码简化为仅查询异常

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)以抑制服务器代码中可能的捕获。

于 2013-10-14T13:40:10.453 回答
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 有错误值。

于 2013-10-17T01:57:24.733 回答