0

内部システムからWebデータベースサーバー(eBillingタイプのデータ)に一連のレコードをバッチ追加しています。データエラー(別の問題)がある場合、その後のすべての追加でエラーが発生するという問題があります。

        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はうまくいく可能性があり、それから私は無効な日付を取得する可能性があります。他に何もサーバーに追加されず、ログはエラーとクラッシュで非難されます。

エラーのある1つのレコードをクリアするか、そのバッチのレコードをクリアするにはどうすればよいですか?したがって、正常に終了し、戻ってエラーを修正し、欠落しているデータを追加し直すことができます。

更新:エラーをログに記録し、問題のレコードを削除して先に進むことができるようにしたいと思います。この場合、それはたまたま日付の問題であり、私はこの1つのインスタンスを解決することを探していませんが、将来のすべての未知の問題を探しています。どうすればいい// Delete out bad record or entire set of records here.ですか?

4

2 に答える 2

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 に答える
0

現在の実装では、すでに各項目を 1 つずつ処理しているため、そのうちの 1 つで処理できるエラーが発生した場合は、処理を続行して処理を続行します。また、一般的な をキャッチしないでください。コード予期するException例外をより具体的にしてください。

try
{
    ...
}
catch (SqlTypeException)
{
    ...
}
于 2012-09-28T14:31:51.490 に答える