2016-06-18 149 views
0

我想使用EPPLUS將數據從Excel導入數據庫。在這裏,我把代碼:https://www.paragon-inc.com/resources/blogs-posts/easy_excel_interaction_pt6db.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條記錄在Excel:

  • ID:21 (鹼基號沒有) |名字:約翰|最後的名字:籠子
  • ID:1 (身份證是在基地) |名字:Mei |姓名:藍色
  • ID:25 (ID不以基準計) |名字:尼克|姓:Siri

而且在數據庫中已經記錄了ID = 1。所以第一和第三應該保存,但第二不應該。問題是隻有第一條記錄是保存的,其餘的(第二條和第三條)會得到一個錯誤。我不知道爲什麼?也許是因爲這是一個交易或什麼?有點奇怪。任何人都可以告訴我該怎麼做才能保存第一和第三張唱片?不僅在這種情況下第一?


錯誤:

ORA-00001: unique constraint primary key violated

什麼沒有任何意義在第3記錄......

+0

特別是您收到什麼錯誤?如果您遺漏了重要信息,我們無法真正幫助您。 – mason

+0

@mason,編輯,現在你可以看到一個錯誤,但仍然沒有意義 – DiPix

+0

@DiPix:你得到這個工作? –

回答

-1

您shouldn't組ID代碼在所有。在數據庫中,將ID設置爲自動增量..當然在你的模型中仍然有它,但不是在你的邏輯中

這樣,你不需要考慮處理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)); 
         } 
        } 
       } 
      } 

不過我的猜測是,因爲你在問題中的代碼是在第三排開始(這似乎哈德ID 21 在你改變它之前,它可能會導致你認爲它是第一行工作正常。

如果刷新數據庫,那麼數據庫中可能已有ID爲21的條目,並且在您將 更改爲25後,運行代碼,您現在可能已經有了一個代碼,並且再次得到相同的錯誤。

我在代碼中添加了一個foreach循環,並檢查了條目的存在,所以代碼應避免主鍵 的鍵違例。

我也try-catch塊中移動這樣的:

db.DB_USER.Add(newUser); 
+0

這不是我預期的答案。因爲這不是我的數據庫,我不能改變結構。 – DiPix

+0

好吧,第二個和第三個錯誤的原因可能是因爲它們已經存在了..第一行不是一開始就存在的,但是當你創建它時,第三個不能被添加,因爲你已經添加了一個帶有該ID的行第一行。 而且正如你指出的第二行ID已經存在 哦,你更新了問題,現在包括錯誤..這是一個主鍵違規,主鍵可能是ID ..你不能添加行與主鍵已經存在,所以你需要檢查它是否存在之前嘗試添加行 –

+0

哦上面的帖子有錯誤。第一和第三條記錄有不同的ID,並且基數不是它們。 – DiPix

0

你爲什麼不這樣做在數據庫中檢查,看是否已經存在於數據庫中的用戶與特定的ID,只如果用戶不存在,請執行插入操作:

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

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

當然,我可以,但是如果會有更復雜的外鍵? – DiPix

+0

通常情況下,外鍵引用不會導致插入問題,就像您在用戶對象上有一個名爲UserTypeID的屬性一樣,您可以使用UserTypeID = 1插入儘可能多的用戶。您因爲主鍵而出現錯誤重點違反,所以我給你一個解決方案,你有問題 –

+0

你是對的,但如果在Excel中的數據將字符串,而不是整數ID列?嘗試catch會處理這個。在你的解決方案中,我必須使用linq處理這個問題。你知道我的意思? – DiPix