2017-05-16 15 views
0

キャッチステートメントの例外処理でデータベースにデータを保存する方法は?私は、変更を保存し、主キーキャッチステートメントのDBへの挿入と保存

foreach(var i in impCSV) 
{ 
    try 
    { 
     var addrDet = new AddrDetail() 
     { 
      Road = i.w_addr1, 
      Road2 = i.w_addr2, 
      Road3 = i.w_addr3, 
      City = i.w_city, 
      Zipcode = i.w_zip 
     }; 

     var invoice = new Invoice() 
     { 
      InvoiceNo = i.rec_no 
     }; 

     var image = new Models.Image() 
     { 
      Image1 = null 
     }; 

     var detail = new DetailPengiriman() 
     { 
      TrDate = null, 
      InsertDate = DateTime.Parse(i.doc_dt) 
     }; 

     var cust = db.Customers.Find(i.cust_id);     
     if (cust !=null) 
     { 
      cust.CustID = i.cust_id; 
      cust.Phone = i.w_phone1; 
      cust.CustComp = i.company; 
      cust.Fullname = i.fullname; 

      db.Entry(cust).State = EntityState.Modified; 
     } 
     else 
     { 
      cust = new Customer() 
      { 
       CustID = i.cust_id, 
       Phone = i.w_phone1, 
       CustComp = i.company, 
       Fullname = i.fullname 
      }; 

      db.Customers.Add(cust); 
     } 
     invoice.CustID = cust.CustID; 

     db.AddrDetails.Add(addrDet); 
     invoice.AddrDetID = addrDet.AddrDetID;  

     db.Images.Add(image); 
     invoice.ImageID = image.ImageID; 

     db.Invoices.Add(invoice); 
     stat.InvoiceNo = invoice.InvoiceNo; 
     detail.InvoiceNo = invoice.InvoiceNo; 

     detail.CompID = compID; 
     db.DetailPengirimen.Add(detail); 

     db.SaveChanges(); 
    } 
    catch (DbEntityValidationException ex) 
    { 
     foreach (var entityValidationErrors in ex.EntityValidationErrors) 
     { 
      foreach (var validationError in entityValidationErrors.ValidationErrors) 
      { 
       Response.Write("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     var logEr = new LogErrorImport() 
     { 
      custid = i.cust_id, 
      fullname = i.fullname, 
      company = i.company, 
      re = i.rec_no, 
      doc = i.doc_dt, 
      addr1 = i.w_addr1, 
      addr2 = i.w_addr2, 
      addr3 = i.w_addr3, 
      city = i.w_city, 
      zip = i.w_zip, 
      phone = i.w_phone1 
     }; 
     db.LogErrorImports.Add(logEr); 
     db.SaveChanges(); 
} 

の重複を防ぐために、別のテーブルにエラーレコードのログを書きたい

もcatch文でコマンドを私はので、エラーが出るように、try文のすべてのレコードを保存主キー

を複製、私は唯一のlogErrorテーブルにデータを保存し、foreachのプロセス

+0

正確にここでの質問は何ですか? – Liam

+1

問題が何であっても、catchステートメントにデータを保存しようとすると、非常に悪い考えです。特に、一般的な 'catch 'の場合はそうです。あなたは何がうまくいかなかったのか分かりません、なぜあなたは再び救い出そうとしていますか?その貯蓄が間違っていたことを、どのようにして知っていますか、同じ行動を盲目的に実行すると結果が異なると思われるのはなぜですか? –

+0

catchステートメントの変更を保存する方法は、saveChangesによって主キーの重複エラーが発生しますが、そのエラーはキャッチしてログに記録します – newbs

答えて

1

を続けているしたいすべてのあなたのLogErrorImportテーブルの主キーを確認してください。自動インクリメントに設定されているID列であることを確認してください。このプライマリキーをコードの任意の場所に設定しないでください。これらのチェックが正しければ、重複したプライマリキーエラーを取得すべきではありません。

更新: あなたは、彼らがお互いに競合しないようにusing声明でtrycatchブロックに「db」とコンテキストの異なるセットを定義する必要があります。

try 
{ 
    using (var _context = new DBContext()) 
    { 
     //Normal save logic here 
    _context.Save(); 
    } 
} 
catch(Exception ex) 
{ 
    using (var _context = new DBContext()) 
    { 
     //Log error here 
    _context.Save(); 
    } 
} 
+1

@Panagiotisのように、 、2番目はSAME文を再度実行しようとします。この変更は例外によって破棄されませんでした。 – newbs

+0

@newbs更新された回答が有効かどうかを確認してください。 – Saket

+0

wowそれはthx haha​​を動作させますが、foreachのためにプロセスをループ開始に戻してからもう一度問題があり、それから私は主なエラーを受け取ります....エラーがあり、catchを入力すると、次のレコードが見つかりましたが、最初のレコードからエラーがありませんでしたし、キャッチ入力しなかった場合は、次のレコードのプリンシパルエラーが発生します。 – newbs

関連する問題