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

返信ありがとうございます。私は今、犯人を見つけました。

私のコードでは、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

SPがVB.Netを介して呼び出されたときに@Errorsが空である理由はわかりませんが、MSSQLを介して実行すると@Errorsにエラー値が含まれます。

于 2013-10-17T01:57:24.733 に答える
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 に答える