2013-11-15 4 views
0

현재 사용자 제공 CSV 파일을 데이터로 데이터베이스에 가져 오는 기능이 필요한 응용 프로그램을 작성 중입니다. CSV의 각 "셀"은 자체 행에 저장됩니다.안전한 대량 데이터 삽입 만들기

처음에는 매개 변수화 된 쿼리를 사용하여 각 행을 하나씩 삽입했지만 작업 속도 (한 예제 파일에 520,000 개의 삽입이 있음)는 다시 생각해야한다는 것을 의미했습니다. 내가 지금 IEnumerable<Answer>에 CSV 파일을 구문 분석하고 다음 코드에 넘겨있어하는 일괄 데이터베이스에 삽입되는 :

public void AddAnswers(IEnumerable<Answer> answers) 
    { 
     const int batchSize = 1000; 

     var values = new StringBuilder(); 
     var i = 0; 
     foreach (var answer in answers) 
     { 
      if (i++ > 0) 
      { 
       values.Append(","); 
      } 
      values.AppendFormat("({0},{1},'{2}')", answer.AnswerSetId, answer.QuestionId, answer.Value.Replace("'", "''")); 

      if (i == batchSize) 
      { 
       // We've reached the batch size limit - send what we have so far 
       SendAnswerBatch(values.ToString()); 
       values.Clear(); 
       i = 0; 
      } 
     } 

     if (i > 0) 
     { 
      // Ensure any leftovers that didn't reach the maximum batch size are sent over 
      SendAnswerBatch(values.ToString()); 
     } 
    } 

    private void SendAnswerBatch(string values) 
    { 
     var query = String.Format("INSERT INTO Answers (AnswerSetId,QuestionId,Value) VALUES {0}", values); 
     Context.Database.ExecuteSqlCommand(query); 
    } 

이 미만 5 분 이상을 복용에서 큰 데이터 세트를 변경 삽입하는 데 5 초가 걸리지 만, 을 ''으로 대체하는 것은 안전하지 않습니다.

분명히 단일 행을 삽입하는 가장 안전한 방법은 매개 변수가있는 쿼리를 사용하는 것이지만 일괄 처리 삽입과 같은 작업을 수행하는 방법이 있습니까?

가능한 한 모든 데이터베이스가 필요합니다. 이미 SqlBulkCopy으로 간주했지만 여러 데이터베이스 엔진을 지원해야합니다. 값이 많이 삽입 할 때

답변

0

난 당신이 SqlBulkCopy의를 사용하는 것이 좋습니다 것은,이 정말 데이터 테이블에 나에게 항목

장소를 유용하고 SqlBulkCopy의 나머지 작업을 수행 할 수 제공. 내 생각에 내가 잘못

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

+0

오전'SqlBulkCopy'는 SQL 서버를 지원하는지? –

+0

@GrahamWager 예, SQLBulkCopy는 SQLServer와 관련이 있습니다. 그게 도움이된다면 OracleBulkCopy가 있습니다. 다른 RDBMS에 대해서는 확신이 없습니다. 'http://docs.oracle.com/html/E10927_01/OracleBulkCopyClass.htm – Bridge