在 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 之间。
有人知道如何实现这一目标吗?感谢您的帮助!:)
如果你想记录导致异常的对象的详细信息.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;
}