以下是我们目前如何保存或更新对象列表:
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之间。
有人知道如何实现这一目标吗? 谢谢您的帮助 ! :)
答案 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;
}