2016-06-18 5 views
0

EPPLUS를 사용하여 Excel에서 DataBase로 데이터를 가져 오려고합니다. 엑셀에서 데이터가 올바른지 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)); 
     } 
    } 
} 

모든 것이 잘 작동 : 여기에서 내가 코드를했다. 문제는 어떤 레코드에 잘못된 데이터가 있는지 여부입니다. 예를 들어, 우리는 엑셀에서 3 개 기록이 :

  • ID : 21 (베이스 ID되지 않음) | 첫 번째 이름 : John | 성명 : Cage
  • ID : 1 (ID는 기본) | 첫 번째 이름 : Mei | 성명 : Blue
  • ID : 25 (ID가 기본이 아닙니다) | 첫 번째 이름 : 닉 | 성명 : Siri

그리고 데이터베이스에 이미 ID = 1 (으)로 기록되어 있습니다. 따라서 1, 3 등은 저장해야하지만 2 위는 저장하지 말아야합니다. 문제는 첫 번째 레코드 만 저장 중이며 나머지 (2 번째 및 3 번째)는 오류가 발생한다는 것입니다. 왜 그런지 몰라? 아마 그것은 하나의 거래 일 것인가? 이상해. 누구나 1, 3 번째 레코드를 저장하려면 어떻게해야합니까? 이 경우 1st 일뿐만 아니라?


오류 : 3 레코드에 어떤 이해가되지 않습니다 어떤

ORA-00001: unique constraint primary key violated

...

+0

특히 오류가 발생합니까? 중요한 정보를 남기지 않으면 우리는 정말로 당신을 도울 수 없습니다. – mason

+0

@mason, 편집 됨, 이제는 오류가 있지만 여전히 감각을 볼 수 없음 – DiPix

+0

@DiPix :이 작업을 수행 했습니까? –

답변

-1

에서 모든 코드에서 당신 shouldn't 세트 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)); 
         } 
        } 
       } 
      } 

내 생각 엔 그 질문에 코드 ID 21 를 HADE 듯 그 (세 번째 행에서 시작되기 때문에 당신이 그것을 바꾸기 전에, 그것이 잘 작동 한 첫 번째 행이라고 생각하게 만들었을 것입니다.

데이터베이스를 새로 고치면 이미 데이터베이스에 ID 21의 항목이 있고 을 25로 변경 한 후 코드를 실행 했으므로 이제는 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

에 대한 훌륭한 자습서가 있습니다. 물론 할 수 있지만 더 복잡한 경우 Foreignkeys ? – DiPix

+0

UserTypeID라는 사용자 개체의 속성이있는 것처럼 외래 키 참조가 삽입 문제를 일으키지 않습니다. UserTypeID = 1로 원하는만큼 많은 사용자를 삽입 할 수 있습니다. 주 때문에 오류가 발생합니다. 키 위반 때문에 당신이 가지고있는 문제에 대한 해결책을 드릴 것입니다 –

+0

당신은 맞습니다. 그러나 엑셀 데이터가 ID 열의 int 대신 문자열 일 경우 어떻게해야합니까? catch는이 문제를 처리합니다. 귀하의 솔루션에서 나는 linq을 사용하여 이것을 처리해야합니다. 내가 무슨 뜻인지 알지? – DiPix