簡體   English   中英

Database.ExecuteSqlCommand-捕獲SQL異常

[英]Database.ExecuteSqlCommand - capture SQL exceptions

====更正====

SQL異常從Database.ExecuteSqlCommand引發。 我期待一個異常,但實際上從我存儲的過程中沒有任何變化。 在調試中,我看到了另一個異常並將這兩種行為混淆了。 我無法刪除問題,因為它有答案。

原始問題

在EF 5(可能還有其他)中,當發生SQL異常時,Database.ExecuteSqlCommand返回-1。 在Visual Studio中進行調試時,異常可見,但是try / catch塊看不到錯誤。

數據庫對象上沒有保存錯誤或狀態的屬性。 該方法的結果是一個整數。 您如何訪問和捕獲錯誤?

更正的例子

        try
        {
            int result = ctx.Database.ExecuteSqlCommand("EXEC dbo.Proc @prm", param );
        }
        catch(Exception ex)
        {
            //This works
            throw ex;
        }

您必須在SQL Server中拋出錯誤,例如:

1)將以下存儲過程添加到數據庫中:

CREATE PROCEDURE myTest   

AS   
 print 'hello'
 RAISERROR('error', 16, 1, 11, 'Take care')
GO  

當您從SSM呼叫時

“消息50000,級別16,狀態1,過程myTest,第14行”錯誤

2)在您的代碼中調用存儲過程:

try
{
  var s =   myDbContext.Database.ExecuteSqlCommand("myTest44");
  Console.WriteLine(s);
}
catch (Exception ex)
{
   Console.WriteLine(ex);
   throw;
}

在控制台的輸出中,您將看到來自SQL Server的錯誤消息“ error ”。 如下圖所示:

在此處輸入圖片說明

結論:

  • 您需要在存儲過程中進行結構化的異常處理,以便可以將錯誤重定向到.Net。

  • 通常,異常是正常拋出的,例如,如果數據庫中不存在SP,則您將收到一個帶有消息{“找不到存儲過程XXX”}的SqlException。

使用SQL Server的“嘗試/捕獲”引發自定義消息的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM