在 SaveOrUpdate 上处理 ADOException,检索无法插入的数据

本文关键字:插入 数据 检索 SaveOrUpdate 处理 ADOException | 更新日期: 2023-09-27 18:34:16

以下是

我们当前保存或更新对象列表的方式:

        ISession sess = GetSession(true);
        try
        {
            foreach (MonType oe in pListobject)
            {
                sess.SaveOrUpdate(oe);
            }
            CommitTransaction();
        }
        catch (Exception ex)
        {
            try
            {
                RollBackTransaction();
            }
            catch
            {
            }
            throw ex;
        }

它运行良好,但现在我想处理对象列表中的异常,以确定哪个对象上的哪个属性无法插入/更新。

例如,考虑对象 Foo 的列表:

List 
new Foo(){pkAtt1 ='123', Att2='456'}
new Foo(){pkAtt1 ='789', Att2='12/12/2015'}

我想知道 pkAtt1='789' 的对象 Foo 无法插入,因为 Att2 等于 '12/12/2015'目前,ADOException为我提供的信息还不足以做到这一点:

插入到 FOO (ATTR1, ATTR2) 值 (?, ?)}

只有这种信息:

Excess SqlDateTime。必须介于 1/1/1753 12:00:00 AM 和 31/12/9999 11:59:59 PM 之间。

有人知道如何实现这一目标吗?感谢您的帮助!:)

在 SaveOrUpdate 上处理 ADOException,检索无法插入的数据

如果你想记录导致异常的对象的详细信息.log它自己在那里。

ISession sess = GetSession(true);
foreach (MonType oe in pListobject)
{
  try
  {
    sess.SaveOrUpdate(oe);
  }
  catch
  {
    Log("Object details", oe.details);//Add whatever details you want to log
    RollBackTransaction();
    throw; // dont throw ex
  }
}
CommitTransaction();

编辑你不需要我之前的外部尝试捕获,只是用更好的方法更新了我的答案。

如果使用实体框架,则可以捕获DbException并获取引发异常的实体。类似的东西

    ISession sess = GetSession(true);
    try
    {
        foreach (MonType oe in pListobject)
        {
            sess.SaveOrUpdate(oe);
        }
        CommitTransaction();
    }
    catch (DbUpdateException ex)
    {
        var entry = ex.Entries.Single(); //get the entity
        // do your stuff
    }
    catch (Exception ex)
    {
        try
        {
            RollBackTransaction();
        }
        catch
        {
        }
        throw ex;
    }