2012-01-17 39 views
0

我正在使用FileHelpers库将CSV文件上载到SQL Server。我想向用户展示无法上传的记录列表,以确定是否存在错误。我将SqlServerStorage类的ErrorMode设置为SaveAndContinue,但是当其中一个记录违反foriegn键约束时,InsertRecords方法仍会引发异常。有没有办法保存这个错误并继续插入?FileHelpers和SQL插入SqlServerStorage类---如何显示错误

SqlServerStorage storage = new SqlServerStorage(typeof(RouteRecord),ConfigurationManager.ConnectionStrings["DBConnString"].ConnectionString); 
storage.ErrorManager.ErrorMode = FileHelpers.ErrorMode.SaveAndContinue; 
storage.InsertRecords((RouteRecord[])Session["successfulRecordArray"]); 

谢谢。

+0

你有哪些代码..我们不知道你的类是什么样的,所以请发布必要的代码示例。也外键约束通常意味着你正在尝试插入相同的值两次或多次,其中只能插入其中一个值。 – MethodMan 2012-01-17 20:12:07

+0

我添加了代码。外键异常正在发生,因为正在尝试将记录添加到主表中没有对应记录的表中。 – kav 2012-01-17 20:24:18

+0

好吧我没有意识到MasterDetail关系无论如何什么是RouteRecord或它在哪里宣布..也有一点你得到typeof(RouteRecord)但插入你是Casting((RouteRecord [])不应该是Session [“ “ToRerayArray”)ToArray()需要看看事物是如何被真正定义的......看起来你可能遇到类型问题 – MethodMan 2012-01-17 20:36:43

回答

0

查看FileHelpers 2.9.9的代码,FileHelpers error handling似乎没有针对作为SqlServerStorage的基类的DatabaseStorage类实现。我认为其原因可能是,由于性能原因,SQL语句是分批处理的,所以不可能catch单个记录的错误。

它不会是太困难通过覆盖InsertRecords(Object[])添加缺少的错误处理,但遗憾的是SqlServerStoragesealed和一些辅助例程是internal,所以你最终不得不对几类复制到你的代码。 (如果您这样做,请确保将ExecuteInBatch设置为false,以便每个SQL语句都得到单独处理 - 这会影响性能)。

或者,您可以在调用InsertRecords()之前调用的单独例程中实施一些外键违例检查(例如,通过枚举RouteRecord[]),但这不会防止出于其他原因的错误。