DapperPlus和Oracle,在插入数据库时知道哪一行引发错误

xzv2uavs  于 2022-11-22  发布在  Oracle
关注(0)|答案(1)|浏览(139)

我们目前面临着一个问题,我们的代码,这是用来推数以千计(有时更多)的条目在我们的数据库一次。
我们为此使用的技术包括:

  • C#语言
  • 实体框架(最新版本)
  • Oracle第12版c
  • Dapper Plus(最新版本)

我们的代码看起来有点像这样:

Try
{
    Trans.BulkInsert(ParentEntity)
         .AlsoBulkInsert(c => c.ChildEntityA)
         .ThenBulkInsert(c => c.ChildEntityB);
}catch(Exception ex)
{
    *error management*
}

对于我们的大多数用例来说,这都能很好地工作。但是当在DB中插入时发生错误时,我们就遇到了一个小问题:我们目前无法确定具体是哪一行触发了错误,这迫使我们将整批数据设置为Error。
我们收到的异常属于Oracle.ManagedDataAccess.Client.OracleException类型,与DbUpdateException不同,该异常不具有.Entries属性。
由于遗留的原因,我们也不能直接访问上下文,我们必须使用一个工厂,它给我们提供了非常有限的访问权限(我们基本上可以获得一个连接字符串,并通过工厂初始化一个连接,但仅此而已)。
在我们使用的技术和面临的限制下,有没有办法知道哪一行导致了插入错误?

svgewumm

svgewumm1#

大 容量 插入 的 问题 是 我们 永远 不 知道 哪 一 行 出错 了 , 我们 只 知道 插入 失败 了 。
发生 错误 时 , 可以 逐个 重试 并 获取 有关 错误 的 信息 :

var errors = new List<BulkOperationError>();

connection.UseBulkOptions(options =>
{
                options.ErrorMode = ErrorModeType.RetrySingleAndContinue;
                options.Errors = errors;
}).BulkInsert(list);

中 的 每 一 个
但是 , 请 注意 , 此 功能 仅 在 SQL Server 上 进行 过 测试 。
如果 您 有 任何 问题 , 我 建议 您 直接 联系 我们 或 在 GitHub 上 发布 :https://github.com/zzzprojects/Dapper-Plus/issues 的 最 大 值

相关问题