====纠错====
从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;
}
答案 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。如下图所示:
<强>结论:强>
您需要在存储过程中进行结构化异常处理,以便可以将错误重定向到.Net。
正常情况下异常将被正常抛出,例如,如果数据库中不存在SP,那么您将收到带有消息{&#34;无法找到存储过程XXX&#34;}的SqlException。
使用SQL Server Try / Catch来引发自定义消息的错误。