2016-06-18 28 views
0

EPPLUSを使用してExcelからDataBaseにデータをインポートしたいとします。ここから私は、コードを取っ:Excelでデータが正しいかどうhttps://www.paragon-inc.com/resources/blogs-posts/easy_excel_interaction_pt6ループ内のdb.SaveChanges()は、エラー後にレコードを保存しません。

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で3つのレコードを持っている:

  • ID:21 (ベースでのIDではない) |ファーストネーム:ジョン|最後の名前:ケージ
  • ID:1 (IDはベース) |ファーストネーム:梅|最後の名前:青
  • ID:25 (IDはベースにありません) |ファーストネーム:ニック|最後にSiri

ID = 1で既に記録されています。 1位と3位はセーブしなければならないが、2位はセーブしないでください。問題は、最初のレコードのみが保存され、残りの部分(2番目と3番目)はエラーになることです。どうしてか分かりません?たぶんそれは1つのトランザクションか何ですか?それは奇妙だ。第1レコードと第3レコードを保存するために何をすべきですか?この場合、1stだけでなく?


エラー:第三レコードにどんな意味がありません。何

ORA-00001: unique constraint primary key violated

...

+0

特にエラーはありますか?重要な情報を残しておけば、本当に助けになることはありません。 – mason

+0

@mason編集されましたが、今はエラーが表示されますが、まだ意味がありません – DiPix

+0

@DiPix:これは動作しましたか? –

答えて

-1

あなたは、コード内でのすべてのIDを設定しshouldn't。データベースでは、IDをautoincrementに設定します。もちろん、あなたのモデルではありますが、あなたのロジックにはありません。

この方法では、IDの処理について考える必要はありません。 ID 21 をhadeように見えたこと

 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のエントリがあり、 を25に変更してコードを実行した可能性があります。このコードを実行すると、おそらく同じエラーが再び発生します。

コードにforeachループを追加し、エントリが存在するかどうかをチェックしました。そのため、コードでは、キーの重複は避けてください。

私はまた、try-catchブロック内でこれを動かす:

db.DB_USER.Add(newUser); 
+0

これは私が期待した答えではありません。それは私のデータベースではないので、構造を変更することはできません。 – DiPix

+0

OK、2番目と3番目にエラーが発生している理由はおそらくすでに存在しているからです。最初の行は最初に存在しませんが、作成すると、そのIDを持つ行が既に追加されているので最初の行 あなたが指摘しているように、2番目の行のIDは既に存在しています ああ、エラーを含むように質問を更新しました。これは主キーの違反です。主キーはおそらくIDです。行を追加できませんすでに存在するプライマリキーで、行が追加される前に最初に存在するかどうかを確認する必要があります。 –

+0

ああ、上記の投稿に間違いがありました。第1と第3のレコードは異なるIDを持ち、ベースはそれらではありません。 – DiPix

0

すでに特定のIDだけを持つデータベース内のユーザーがあるかどうかを確認するために、データベースのチェックをしないのはなぜユーザーが存在しない場合は挿入してください:

bool exists = db.DB_USER.Where(u => u.ID == newRecord.ID).Any(); 

    if(!exists) 
    { 
     //Do the insert 
    } 
+0

もちろん、可能ですが、もっと複雑なForeignkeys ? – DiPix

+0

UserTypeIDと呼ばれるユーザオブジェクトのプロパティを持っていた場合のように、通常は外部キー参照によって挿入の問題が発生しません。UserTypeID = 1で好きなだけ多くのユーザーを挿入できます。プライマリのためにエラーが発生しています私はあなたに問題の解決方法を教えてくれました –

+0

あなたは正しいですが、ExcelのデータがID列の代わりに文字列になるのはどうでしょうか? catchはこれで処理します。あなたのソリューションで私はlinqを使用してこれで処理する必要があります。私の言っていることが分かるよね? – DiPix

関連する問題