gpt4 book ai didi

c# - Database.ExecuteSqlCommand - 捕获 SQL 异常

转载 作者:行者123 更新时间:2023-12-03 08:27:09 25 4
gpt4 key购买 nike

====更正====

从 Database.ExecuteSqlCommand 引发 SQL 异常。我期待一个异常(exception),但实际上并没有从我的存储过程中得到任何改变。在调试中,我看到了另一个异常并混淆了这两种行为。 我无法删除问题,因为它有答案。

原始问题

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

数据库对象上没有保存错误或状态的属性。该方法的结果是一个整数。您如何访问和捕获错误?

更正示例

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

最佳答案

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

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 的错误消息“ 错误 ”。如下图所示:

enter image description here

结论:
  • 您需要在存储过程中进行结构化异常处理,以便可以将错误重定向到 .Net。
  • 通常会正常抛出异常,例如,如果数据库中不存在 SP,那么您将收到带有消息 {"Could not find stored procedure XXX"} 的 SqlException。

  • 使用 SQL 服务器 Try/Catch 来引发自定义消息的错误。

    关于c# - Database.ExecuteSqlCommand - 捕获 SQL 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38354237/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com