Database.ExecuteSqlCommand - 捕获SQL异常

时间:2016-07-13 14:17:29

标签: c# entity-framework exception error-handling

====纠错====

从Database.ExecuteSqlCommand抛出SQL异常。我期待一个例外,但实际上我的存储过程没有变化。在调试中,我看到了另一个异常并混淆了这两种行为我无法删除该问题,因为它有答案。

原始问题

在EF 5(可能还有其他)中,当发生SQL异常时,Database.ExecuteSqlCommand返回-1。在Visual Studio中进行调试时,异常是可见的,但try / catch块不会看到错误。

Database对象上没有包含错误或状态的属性。该方法的结果是整数。你如何访问和捕获错误?

已更正示例

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

1 个答案:

答案 0 :(得分:1)

您必须在SQL服务器中抛出错误,例如:

1)将以下存储过程添加到您的数据库中:

CREATE PROCEDURE myTest   

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

当您从SSM打电话时

" Msg 50000,Level 16,State 1,Procedure myTest,Line 14" 错误

2)在代码中调用存储过程:

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

在控制台的输出中,您会看到错误消息" 错误"来自SQL Server。如下图所示:

enter image description here

<强>结论:

  • 您需要在存储过程中进行结构化异常处理,以便可以将错误重定向到.Net。

  • 正常情况下异常将被正常抛出,例如,如果数据库中不存在SP,那么您将收到带有消息{&#34;无法找到存储过程XXX&#34;}的SqlException。

使用SQL Server Try / Catch来引发自定义消息的错误。