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

时间:2016-02-12 09:23:08

标签: c# nhibernate

以下是我们目前如何保存或更新对象列表:

        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'}

我想知道对象Foo与pkAtt1 =' 789'未能插入,因为Att2等于' 12/12 / 2015' 目前,ADOException没有为我提供足够的信息:

  

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

仅提供此类信息:

  

多余的SqlDateTime。必须在1/1/1753 12:00:00 AM和31/12/9999 11:59:59 PM之间。

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

2 个答案:

答案 0 :(得分:0)

如果要记录导致异常的对象的详细信息。记录它自己。

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();

修改 你不需要我以前的外部尝试捕获,只是用更好的方法更新我的答案。

答案 1 :(得分:0)

如果使用实体框架,则可以捕获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;
    }