2013-10-14 15 views
0

有人已經遇到過這樣的錯誤,像存儲過程引發錯誤,但客戶端(vb.net)沒有發現錯誤?VB.Net不捕捉存儲過程raiserror

下面是我的代碼調用存儲過程從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'。 運行RefreshDependentViews CustomerSalesOrder的錯誤50000,級別16,狀態1,過程RefreshDependentViews,行 :未能到 SP_REFRESHVIEW _Merged_SalesOrder_。消息:無效的對象名稱 'dbo._Merged_SalesOrder_with_Details'。運行時出錯 RefreshDependentViews CustomerSalesOrder:SP_REFRESHVIEW失敗 _SOG_New。消息:無效的對象名稱'Hips54.dbo.SupplierPurchaseReceiptDetailView'。

上述錯誤未被vb.net中的try-catch所捕獲。這就像沒有在我的SP

+0

SP中放置了RAISERROR嗎? – Ric

+0

顯示您的SP代碼。如果SP拋出一個,VB.NET將捕獲錯誤。 – Steve

回答

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 

而且它拋出的第一個catch捕獲異常預期。所以問題似乎是存儲過程。我會嘗試更改嚴重性(16 - > 20)以支持可能的服務器代碼捕獲。

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 

代碼,我不知道原因@Errors是空的,當SP被稱爲直通VB.Net但如果我運行它通過MSSQL @錯誤有錯誤值。