故障排除SqlException

3

编辑3

为了明确,目前情况如下:

1)我在输出中看到了SQL异常,但它没有“捕获”任何异常……代码正常执行,我知道有异常的唯一原因是我正在查看输出窗口。实体似乎在初始读取时有效(返回了预期数据)。

2)当我尝试执行 .SaveChanges 时,实体会挂起,但我似乎无法“捕获”任何异常……它只是挂起。不知道为什么?

原帖

我有一个使用Entity Framework 6.1.3、.Net 4.5的C#控制台应用程序。

我能够读取我的数据库,所以我知道连接字符串和凭据是正确的。我的问题是,当我执行DbContext.SaveChanges()时,我的应用程序会挂起,如果我将鼠标悬停在Visual Studio中的SaveChanges方法上,弹出窗口会显示它已经抛出了:

System.Data.Entity.InfrastructureDbUpdateException
System.Data.Entity.InfrastructureConcurrencyException
System.Data.Entity.Validation.DbEntityValidationException
System.NoSupportedException
System.ObjectDisposedException
System.InvalidOperationException

我试图按照下面的代码捕捉这些异常,但在阅读其他SO文章时,似乎我无法捕捉到这些异常?有人知道如何捕获这些异常吗?

请注意,在执行这些 SaveChanges 之前,我已经能够从另一个表中读取数据,因此我知道我的凭据和连接字符串有效,并且我已经建立了连接。

还有一个信息:这在几天前仍然有效... 我不知道我可能做了什么来“破坏”它!在另一台服务器上使用SQL Server。

连接字符串是:

<add name="DataContext" 
     connectionString="data source=1.2.3.4;initial catalog=db1;user id=user1;password=pwd1;MultipleActiveResultSets=True;App=EntityFramework" 
     providerName="System.Data.SqlClient" />

总之,我的应用程序在执行.SaveChanges时卡住了,我不知道为什么……

try
{
    return _context.SaveChanges();
}
catch (DbUpdateException e)
{
    Console.WriteLine(e.ToString());
    Console.ReadLine();
    return 0;
}
catch (DbEntityValidationException dbEx) // added for debug.
{
    foreach (var validationErrors in dbEx.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            Trace.TraceInformation("Property: {0} Error: {1}",
                                   validationError.PropertyName,
                                   validationError.ErrorMessage);
            Console.WriteLine(string.Format("Property: {0} Error: {1}",
                                            validationError.PropertyName,
                                            validationError.ErrorMessage));
            Console.ReadLine();
        }
    }

    return 0;
}
catch (Exception e)
{
    Console.WriteLine(e.ToString());
    Console.ReadLine();
    return 0;
}

编辑1

异常并不是真实存在的。它们是由ReSharper或MS Productivity工具提供的弹出窗口,用来显示可能的异常...我猜。

所以我只剩下在 .SaveChanges 处停顿而无法知道为什么的情况了?

编辑2

我发现在第一次读取数据库时,即使读取成功,调试输出窗口也会显示异常!请注意,这也在 try/catch (Catch (Exception e)) 块内,并且异常未被捕获!

在 System.Data.dll 中发生了“System.Data.SqlClient.SqlException”的一次机会异常
在 EntityFramework.dll 中发生了“System.Data.Entity.Core.EntityCommandExecutionException”的一次机会异常
在 EntityFramework.SqlServer.dll 中发生了“System.Data.Entity.Core.EntityCommandExecutionException”的一次机会异常


怎么办?我甚至无法捕获外部异常。我只知道在将鼠标悬停在SaveChanges上时会出现异常,但应用程序已经挂起了。 - Ed Landau
也许我错了,悬停弹出窗口只显示“可能”的异常吗?如果是这样,应用程序就挂起了,我不知道为什么。:( 我有ReSharper和MS Power Productivity Tools,所以其中一个可能会显示可能的异常列表? - Ed Landau
激活抛出所有异常并关闭“仅调试我的代码”选项。也许这样你可以获得更多信息。 - Andre
  1. 不确定如何“激活Throw”。
  2. 尝试在发布模式下运行。出现了在Debug中存在的引用异常...不确定,但现在正在追踪它们。
  3. 不确定如何确定生成复制它们的SQL实体是什么。它们最初是从SQL翻译而来的(我从原始的SQL开始)。
- Ed Landau
思考问题本身:你说代码以前可以运行,但现在不行了。这听起来似乎取决于正在加载/保存的数据。问题可能是由于实体映射中的错误配置引起的。如果没有看到你的代码和映射,我就不知道具体情况,但这是我开始解决问题的地方。 - cbp
显示剩余8条评论
1个回答

0
你的问题在于 e.ToString()。你需要检查 e.Message 属性。你也可以检查是否存在 e.InnerException。
catch (Exception e)
{
    if (e.InnerException != null) {
       Console.WriteLine(e.InnerException);
    } else {
       Console.WriteLine(e.Message);
    }

    Console.ReadLine();
    return 0;

}

我很感激你的尝试……但是就像我说的,我甚至还没有进入Catch。 - Ed Landau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接