You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何捕获SaveChanges的SqlException并弹出提示框?

解决SaveChanges()触发SqlException时try-catch未生效的问题

看起来你在删除仓库记录时遇到了SqlException,但你的try-catch没有按预期弹出提示框。我来帮你分析下问题所在,然后给出修复方案:

问题分析

你的第二段代码里,把Listele()也放在了try块中——如果SaveChanges()成功执行,但Listele()方法内部抛出了异常,那catch块会被这个异常触发,但这不是你要捕获的删除操作的SqlException。更关键的是,你捕获的是泛型Exception,而且没有输出具体错误信息,这很难排查到底是哪里出了问题(比如最常见的外键约束冲突:这个仓库还有关联的子记录,数据库不允许直接删除)。

修复后的代码

if (MessageBox.Show("Bu satırı sil !!!", "Evet", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
    if (dataGridView1.CurrentRow != null)
    {
        int ware_id = (int)dataGridView1.CurrentRow.Cells["WAREHOUSE_ID"].Value;
        var itemToRemove = cnt.WAREHOUSEs.SingleOrDefault(x => x.WAREHOUSE_ID == ware_id);
        
        if (itemToRemove != null)
        {
            cnt.WAREHOUSEs.Remove(itemToRemove);
            try
            {
                cnt.SaveChanges();
                // 只有SaveChanges成功后才刷新列表
                Listele();
                MessageBox.Show("Silme işlemi başarılı!"); // 可选:提示删除成功
            }
            // 明确捕获SqlException,针对性处理数据库相关错误
            catch (SqlException ex)
            {
                // 显示具体的错误信息,方便排查问题
                MessageBox.Show($"Silme işlemi başarısız oldu: {ex.Message}\nHata Kodu: {ex.Number}");
            }
            // 可以保留泛型Exception捕获其他意外错误
            catch (Exception ex)
            {
                MessageBox.Show($"Beklenmeyen bir hata oluştu: {ex.Message}");
            }
        }
    }
}

关键改进点

  • 缩小try块范围:只把SaveChanges()和成功后的Listele()放在try块里,确保捕获的是删除操作的异常。
  • 明确捕获SqlException:数据库相关的错误(比如外键约束、权限问题)都会触发这个异常,比泛型Exception更精准。
  • 输出具体错误信息:把ex.Message和错误代码ex.Number显示出来,你就能知道到底是数据库的什么问题导致删除失败(比如错误码547就是外键约束冲突)。
  • 可选的成功提示:删除成功后给用户反馈,提升体验。

额外排查点

如果这样修改后还是没触发catch块,那你要检查:

  • 有没有全局异常处理程序(比如AppDomain.UnhandledException)捕获了这个异常,导致局部try-catch没机会执行。
  • 确认cnt的上下文状态是否正常,有没有其他地方修改了同一个实体导致冲突。

内容的提问来源于stack exchange,提问作者Semih ŞEN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:23:19