0

我正在将来自内部系统的一堆记录批量添加到我们的 Web 数据库服务器(电子账单类型数据)。我有一个问题,如果存在数据错误(单独的问题),则每次添加之后都会出错。

        foreach (InvoiceHeader invoiceHeader in invoiceHeaders)
        {
            rrn++;
            db.AddToInvoiceHeaders(invoiceHeader);
            if (rrn >= RECORDS_AT_A_TIME)
            {
                try
                {
                    db.SaveChanges();
                    rrn = 0;
                }
                catch (Exception e)
                {
                    string errorText = "Error in blah blah blah \n\n";
                    errorText += "Error: " + e.ToString();
                    Log.Error(errorText);
                    // Delete out bad record or entire set of records here.
                }
            }
        }

所以前 500 个可能会很好,然后我可能会得到一个无效的日期。没有其他任何东西被添加到服务器中,并且日志会因错误和崩溃而受到猛烈抨击。

如何清除错误的一条记录或仅清除那批记录?所以它可以正确完成,我们可以返回并修复错误,从而添加丢失的数据。

更新:我希望能够只记录错误,删除问题记录并继续。在这种情况下,它恰好是一个日期问题,我不是在寻找解决这个实例,而是在寻找所有未来未知的问题。我该怎么做// Delete out bad record or entire set of records here.

4

2 回答 2

0

使用您当前的实现,您已经在逐一处理每个项目,因此,如果其中一个项目发生您可以处理的错误,那么只需这样做并继续处理。此外,不要抓住一般性Exception,更具体地说明您的代码应该期待哪些异常,例如

try
{
    ...
}
catch (SqlTypeException)
{
    ...
}
于 2012-09-28T14:31:51.490 回答
0

这可能是一个不太理想的解决方案,但似乎对我需要继续进行的工作有效。

        foreach (InvoiceHeader invoiceHeader in invoiceHeaders)
        {
            rrn++;
            if (rrn >= RECORDS_AT_A_TIME)
            {
                try
                {
                    db.SaveChanges();
                    rrn = 0;
                }
                catch (Exception e)
                {
                    string errorText = "Error in blah blah\n\n";
                    errorText += "Error: " + e.ToString();
                    Log.Error(errorText);
            // Throw out all of these records so we can move on.
            // Probably not the best solution, but it works.
                    db.Dispose();
                    db = new db_Entities();
                }
            }
        }
于 2012-09-28T15:13:04.240 回答