我在库中有以下代码,用于对数据库记录执行删除操作。我的代码使用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。