DapperPlus 和 Oracle,在插入数据库时知道哪一行抛出错误
DapperPlus and Oracle, know which row is throwing an error when inserting to DB
我们的代码目前面临一个问题,该代码用于一次将数千(有时更多)条目推送到我们的数据库中。
我们为此使用的技术是:
- C#
- Entity Framework(最新版本)
- 甲骨文 12c
- Dapper Plus(最新版本)
我们的代码看起来有点像这样:
Try
{
Trans.BulkInsert(ParentEntity)
.AlsoBulkInsert(c => c.ChildEntityA)
.ThenBulkInsert(c => c.ChildEntityB);
}catch(Exception ex)
{
*error management*
}
对于我们的大多数用例,这都可以正常工作。
但是当在数据库中插入过程中发生错误时,我们会遇到一些问题:我们目前无法判断具体是哪一行触发了错误,迫使我们将整批数据设置为 Error.
我们收到的异常是 Oracle.ManagedDataAccess.Client.OracleException 类型,与 DbUpdateException 不同,它不具有“.Entries” 属性.
由于遗留原因,我们也无法直接访问上下文,我们必须使用给我们提供非常有限访问权限的工厂(我们基本上可以获取连接字符串,并通过工厂初始化连接,但是仅此而已。
有什么方法可以根据我们正在使用的技术和我们面临的限制来知道是哪一行导致了插入错误?
批量插入时的问题是我们永远不知道哪一行出错了。我们只知道插入失败。
可以在发生错误时逐一重试并获取错误信息:
var errors = new List<BulkOperationError>();
connection.UseBulkOptions(options =>
{
options.ErrorMode = ErrorModeType.RetrySingleAndContinue;
options.Errors = errors;
}).BulkInsert(list);
但是,请注意,此功能仅在 SQL 服务器上测试过。
如果您有任何问题,我建议您直接联系我们或 post GitHub:https://github.com/zzzprojects/Dapper-Plus/issues
我们的代码目前面临一个问题,该代码用于一次将数千(有时更多)条目推送到我们的数据库中。
我们为此使用的技术是:
- C#
- Entity Framework(最新版本)
- 甲骨文 12c
- Dapper Plus(最新版本)
我们的代码看起来有点像这样:
Try
{
Trans.BulkInsert(ParentEntity)
.AlsoBulkInsert(c => c.ChildEntityA)
.ThenBulkInsert(c => c.ChildEntityB);
}catch(Exception ex)
{
*error management*
}
对于我们的大多数用例,这都可以正常工作。 但是当在数据库中插入过程中发生错误时,我们会遇到一些问题:我们目前无法判断具体是哪一行触发了错误,迫使我们将整批数据设置为 Error.
我们收到的异常是 Oracle.ManagedDataAccess.Client.OracleException 类型,与 DbUpdateException 不同,它不具有“.Entries” 属性.
由于遗留原因,我们也无法直接访问上下文,我们必须使用给我们提供非常有限访问权限的工厂(我们基本上可以获取连接字符串,并通过工厂初始化连接,但是仅此而已。
有什么方法可以根据我们正在使用的技术和我们面临的限制来知道是哪一行导致了插入错误?
批量插入时的问题是我们永远不知道哪一行出错了。我们只知道插入失败。
可以在发生错误时逐一重试并获取错误信息:
var errors = new List<BulkOperationError>();
connection.UseBulkOptions(options =>
{
options.ErrorMode = ErrorModeType.RetrySingleAndContinue;
options.Errors = errors;
}).BulkInsert(list);
但是,请注意,此功能仅在 SQL 服务器上测试过。
如果您有任何问题,我建议您直接联系我们或 post GitHub:https://github.com/zzzprojects/Dapper-Plus/issues