[英]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.