2016-02-12 50 views
0

下面是我们目前如何做保存或对象的列表的更新数据:手柄ADOException,检索无法插入

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

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

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

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

我想知道,与pkAtt1 =“789”对象美孚未能插入,因为ATT2等于'12 /二千零十五​​分之十二“ 目前,ADOException提供我没有足够的信息来做到这一点:(?)

INSERT INTO FOO(ATTR1,ATTR2)VALUES}

仅限此类信息:

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

有人知道如何做到这一点? 感谢您的帮助! :)

+0

不要说'throw ex';只是“抛出”,否则当你在外面捕捉时,你会吞下堆栈跟踪。 – CarbineCoder

回答

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

编辑 你不需要外尝试捕捉在我以前的,刚刚更新了我的答案有更好的办法。

+0

完美,这正是我所寻找的:D我不知道SaveOrUpdate“记录”了错误,虽然它是CommitTransaction发生时的错误。谢了哥们! – Perthusion

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