为什么SqlException没有被抛出/捕获



我在库中有以下代码,用于对数据库记录执行删除操作。我的代码使用Dapper库。当我调用Dapper Execute((方法时,出现了错误。

某些数据库表记录无法删除,因为它们被其他表中的相关记录引用。当记录不能被删除时;DELETE语句与REFERENCE约束"相冲突;发生(如预期(。此错误会在调用Execute时导致System.Data.SqlClient.SqlException,并且此异常会使我的程序崩溃。

我写了一个try/catch来处理这个错误,但程序在try中仍然崩溃,并且没有移动到catch块。似乎Execute((没有抛出异常?我也尝试过使用Query((方法来获得相同的结果。我不知道如何才能抓住并处理这个例外!

private IDbConnection db;
public Repository(string connectionString)
{
db = new SqlConnection(connectionString);
}
public void DeletePerson(string PersonID)
{
string query = "DELETE FROM PERSON WHERE PersonID = @PersonID";
try
{
db.Execute(query, new { PersonID });  //program crashes here b/c of SqlException
}
catch (Exception ex)
{
throw ex;
}
}

以下是调用此方法的代码(来自不同的项目(。它也在尝试/接球,但从未达到接球。

string id = "BELWIT";
try
{
conn.DeletePerson(id);
}
catch
{
MessageDialog errorMsg = new MessageDialog("Delete failed.");
errorMsg.ShowAsync();
}

看起来这个错误实际上是由我的Visual Studio设置引起的。

在"异常设置"中有一个复选框,其中为System.Data.SqlClient.SqlException选中了"抛出时中断"。因此,它正在中断并停止Visual Studio中的执行。忽略异常弹出并单击"继续"允许我的代码移动到catch块。

愚蠢的结果并考虑删除,但也许把它留在这里,以防其他人遇到同样的问题会有所帮助?

看起来errorMsg.ShowAsync((是一个异步方法。一种可能性是您没有等待该方法,因此程序在显示该消息之前就完成了执行。你能试着把它改成吗

await errorMsg.ShowAsync();

您还需要将调用它的任何方法标记为async。

最新更新