0

EPPLUS を使用して、Excel から DataBase にデータをインポートしたいと考えています。ここからコードを取得しました: https://www.paragon-inc.com/resources/blogs-posts/easy_excel_interaction_pt6

using (var db = new DbEntities())
{
    for (var row = 2; row <= lastRow; row++)
    {
        var newRecord = new DB_USER
        {
            ID = Int32.Parse(worksheet.Cells[idColumn + row].Value.ToString()),
            FIRST_NAME = worksheet.Cells[firstNameColumn + row].Value.ToString(),
            LAST_NAME = worksheet.Cells[lastNameColumn + row].Value.ToString(),                               
        };

        db.DB_USER.Add(newRecord);
        try
        {
            db.SaveChanges();
            totalImported++;
        }
        catch (Exception ex)
        {
            resultMessages.Add(string.Format("Error in line #{0}: {1}\n", row,
                ex.Message));
        }
    }
}

Excelのデータが正しければ、すべて正常に機能します。問題は、レコードに無効なデータがあるかどうかです。たとえば、Excel に 3 つのレコードがあります。

  • ID: 21 (ID がベースにありません) | 名: ジョン | 姓: ケージ
  • ID: 1 (ID はベースにあります) | FIRST NAME: めい | 姓: 青
  • ID: 25 (ID がベースにありません) | 名: ニック | 姓: シリ

そして、データベースにはすでに で記録されていID = 1ます。したがって、1 番目と 3 番目は保存する必要がありますが、2 番目は保存しないでください。問題は、最初のレコードのみが保存され、残り (2 番目と 3 番目) がエラーになることです。どうしてか分かりません?たぶん、それは1つのトランザクションまたは何ですか?それは奇妙だ。1番目と3番目のレコードを保存するにはどうすればよいか誰か教えてもらえますか? この場合は1stだけじゃない?


エラー:

ORA-00001: 一意制約の主キーに違反しています

3番目のレコードで意味をなさないものは...

4

3 に答える 3

-1

コードで ID をまったく設定しないでください。データベースで、ID を autoincrement に設定します。もちろん、モデルにはまだありますが、ロジックにはありません。

この方法では、ID の処理について考える必要はありませんが、代わりにエンティティ フレームワークに処理させます。

とにかく、コードを変更する方法についてのアイデアは次のとおりです。

        using (var db = new DbEntities())
            {
                foreach (user in db)
                {
                    var userExists = db.DB_USER.Where(u => u.ID == user.ID);

                    if(!userExists)
                    {
                        var newUser = new DB_USER
                        {
                                ID = Int32.Parse(worksheet.Cells[idColumn + row].Value.ToString()),
                                FIRST_NAME = worksheet.Cells[firstNameColumn + row].Value.ToString(),
                                LAST_NAME = worksheet.Cells[lastNameColumn + row].Value.ToString(),                               
                        };

                        try
                        {
                            db.DB_USER.Add(newUser);
                            db.SaveChanges();
                            totalImported++;
                        }
                        catch (Exception ex)
                        {
                             resultMessages.Add(string.Format("Error in line #{0}: {1}\n", row,
                             ex.Message));
                        }
                    }
                }
            }

それでも私の推測では、問題のコードは 3 行目から始まっているため (変更する前に ID 21 を持っていたように見えたので、最初の行がうまく機能したと思われたかもしれません。

データベースを更新すると、ID 21 のエントリが既にデータベースに存在し、それを 25 に変更してコードを実行すると、おそらく 25 のエントリもあり、同じエラーが再び発生します。

コードに foreach ループを追加し、エントリの存在をチェックすることで、コードは主キー違反を回避する必要があります。

これも try-catch ブロック内に移動します。

db.DB_USER.Add(newUser);
于 2016-06-18T20:31:35.647 に答える