현재 사용자 제공 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
으로 간주했지만 여러 데이터베이스 엔진을 지원해야합니다. 값이 많이 삽입 할 때
오전'SqlBulkCopy'는 SQL 서버를 지원하는지? –
@GrahamWager 예, SQLBulkCopy는 SQLServer와 관련이 있습니다. 그게 도움이된다면 OracleBulkCopy가 있습니다. 다른 RDBMS에 대해서는 확신이 없습니다. 'http://docs.oracle.com/html/E10927_01/OracleBulkCopyClass.htm – Bridge