2010-01-08 8 views
0

개체 컬렉션을 기반으로 많은 레코드를 데이터베이스 (SQL2000 이후)에 삽입하는 최적의 방법에 대한 조언을 찾고 있습니다.해시 테이블에서 데이터베이스에 레코드 삽입

현재 내 코드는 아래 코드 조각과 비슷하며 각 레코드는 단일 SQL INSERT 명령을 사용하여 삽입됩니다 (함수를 호출 할 때마다 데이터베이스 연결을 열고 닫음)! ?).

루틴은 일상적으로 최대 100,000 개의 레코드를 삽입 할 수 있어야하며 더 빠른 방법이 있는지 궁금해하고 있습니다. XML 기반 데이터 및 대량 복사 루틴을 사용하여 언급 한 몇 가지 게시물을 보았습니다. - 고려해야 할 사항입니까, 아니면 누군가가 제가 작성할 수있는 간단한 예제를 제공 할 수 있습니까? 어떤 조언을

foreach (DictionaryEntry de in objectList) 
{ 
    eRecord record = (eRecord)de.Value; 

    if (!record.Deleted) 
    { 
    createDBRecord(record.Id,    
        record.Index, 
        record.Name, 
        record.Value); 
    } 
} 

감사합니다,

폴.

답변

2

그렇게하는 것은 상대적으로 느립니다. BCP 또는 BULK INSERT를 사용하여 대량 INSERT 기술을 고려해야하며, .NET 2.0을 사용하는 경우 SqlBulkCopy class을 사용할 수 있습니다. 여기 SqlBulkCopy - Copy Table Data Between SQL Servers at High Speeds

2000 SQL Server에 대한 간단한 예제 : 다음은 SqlBulkCopy의 사용의 예

당신은 CSV 파일이있는 경우, csvtest.txt, 다음과 같은 형식 :

1, 존 스미스

2, 밥, 희망

3, 케이트, 퀴리

4, 피터, 녹색

(모든 행이 삽입되지는 않습니다 오류가 있지만, 다른 행이있을 경우) 617,451,515,

이 SQL 스크립트는 데이터베이스 테이블에 csv 파일의 내용을로드합니다 :

USE myDB 
GO 

CREATE TABLE CSVTest 
(
    ID INT, 
    FirstName VARCHAR(60), 
    LastName VARCHAR(60) 
) 
GO 

BULK INSERT 
CSVTest 
FROM 'c:\temp\csvtest.txt' 
WITH 
(
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 
GO 


SELECT * 
FROM CSVTest 
GO 

당신은 사전에 내용을 쓸 수 CSV 파일에 넣은 다음 BULK INERT 파일에 저장하십시오.

은 참조 : 당신이 당신의 자신의 IDataReader에 방법을 구현하는 경우 Using bcp and BULK INSERT

, 당신이 imtermediate 파일에 쓰기 방지 할 수있다. ADO.NET 2.0 Tutorial : SqlBulkCopy Revisited for Transferring Data at High Speeds

관련 SO 질문을 참조하십시오 : how to pass variables like arrays/datatable to SQL server?

+0

대답에 대한 감사를 내가 데이터베이스에서 직접 작업을하고 싶습니다으로 그래서 당신이 언급 한 클래스로 살펴 보겠습니다 .NET 2.0을 사용하고 예 가능하다면. SqlBulkCopy 클래스에 대한 경험이 있습니까? 감사합니다. Paul – Paul

+0

@Paul : 물론 있습니다. SqlBulkCopy가 올바르게 완료되었습니다. 나는 팀이 그걸로 3 배를 달성하도록 도왔다. –

+0

감사합니다. Mitch - 읽기 시작하고 학습하기 시작했습니다. 건배 – Paul