복붙노트

[SQL] 목록에서 SqlBulkCopy의 <>

SQL

목록에서 SqlBulkCopy의 <>

어떻게 간단한 객체의 목록 <>에서 SqlBulkCopy의와 큰 삽입을 할 수 있습니까?

나는 내 사용자 지정 IDataReader에 구현합니까?

해결법

  1. ==============================

    1.간단히 객체의 목록에서 DataTable을을 생성하고 데이터 테이블을 전달 SqlBulkCopy.WriteToServer를 호출합니다.

    간단히 객체의 목록에서 DataTable을을 생성하고 데이터 테이블을 전달 SqlBulkCopy.WriteToServer를 호출합니다.

    다음과 같은 도움을 찾을 수 있습니다 :

    SqlBulkCopy의와 최대 성능을 위해, 당신은 적절한 BatchSize에서 설정해야합니다. 10,000 잘 작동하는 것 같다 -하지만 프로파일 데이터에 대한.

    SqlBulkCopyOptions.TableLock를 사용할 때 당신은 또한 더 나은 결과를 관찰 할 수 있습니다.

    SqlBulkCopy의 성능의 재미 있고 유익한 분석은 여기에서 찾을 수 있습니다.

  2. ==============================

    2.FastMember, 당신은 이제까지 DataTable을 (성능을 더보다가-두 배로 내 테스트에서하는)를 통해 갈 필요없이이 작업을 수행 할 수 있습니다

    FastMember, 당신은 이제까지 DataTable을 (성능을 더보다가-두 배로 내 테스트에서하는)를 통해 갈 필요없이이 작업을 수행 할 수 있습니다

    using(var bcp = new SqlBulkCopy(connection))
    using(var reader = ObjectReader.Create(data, "Id", "Name", "Description"))
    {
        bcp.DestinationTableName = "SomeTable";
        bcp.WriteToServer(reader);
    }
    

    참고 ObjectReader 제네릭이 아닌 소스와 작업도 할 수 있고, (당신은 아마 당신이 ObjectReader 자체를 지정하지 않은 경우에는 SqlBulkCopy의 ColumnMappings 측면을 사용하려는 있지만)는 사전에 회원-이름을 지정할 필요가 없습니다.

  3. ==============================

    3.당신은 Microsoft에서 제공하는이 EntityDataReader 클래스를 추가하는 경우 늦게 파티에,하지만, 정확히 않는 AsDataReader () 확장 방법이있다 : https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs

    당신은 Microsoft에서 제공하는이 EntityDataReader 클래스를 추가하는 경우 늦게 파티에,하지만, 정확히 않는 AsDataReader () 확장 방법이있다 : https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs

    (실시 예 [목록] .AsDataReader () 구현 :)

    var connStr = "";
    using (var connection = new SqlConnection(connStr)) 
    {
        var startTime = DateTime.Now;
        connection.Open();
        var transaction = connection.BeginTransaction();
        try
        {
            //var connStr = connection.ConnectionString;
            using (var sbCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
            {
                sbCopy.BulkCopyTimeout = 0;
                sbCopy.BatchSize = 10000;
                sbCopy.DestinationTableName = "Foobars";
                var reader = Foobars.AsDataReader();
                sbCopy.WriteToServer(reader);
            }
            transaction.Commit();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            transaction.Rollback();
        }
        finally
        {
            transaction.Dispose();
            connection.Close();
            var endTime = DateTime.Now;
            Console.WriteLine("Upload time elapsed: {0} seconds", (endTime - startTime).TotalSeconds);
        }
    }
    
  4. ==============================

    4.당신이 처음에 SqlBulkCopy의를 호출하여 수행하려는 작업에 따라, 그것은 테이블 반환 매개 변수 (TVP)를 사용하는 것이 더 적합 할 수 있습니다. TVP를 사용하는 것은 사소한 사용자 정의 형식의 컬렉션에 보낼 수 있도록한다. 데이터는 (많은 @Marc Gravell의 대답처럼) 당신이 DataTable을 피할 수 있도록에서 스트리밍 할 수 있으며뿐만 아니라 SqlBulkCopy의를 피할 수 있습니다. TVP 년대는 저장 프로 시저에 TVP 데이터를 전달하기 위해 전화로는 SQL 서버에 도달하고 당신이 아니라 INSERT합니다 (인으로 아무것도 할 수있는 테이블 변수로 표시하면 데이터를 처리하는 방법을 완전히 유연성을 허용 SqlBulkCopy의를 가진 경우). 또한 데이터는 새로 생성 된 IDENTITY 값 등의 SqlDataReader 개체를 통해 데이터를 백업 할 수 있습니다. 나는 예를 들어,이 대답에 몇 가지 추가 메모를 추가 : 어떻게 가능한 짧은 시간에 1000 만 개 기록을 삽입 할 수 있습니다? 그리고 정의의 일반 목록에 전달하는 작업 예제를 제공 또한 링크 대답에 기록됩니다 SQL Server 중앙에 대한 기사 (무료 등록 필요), 응용 프로그램에서 스트리밍 데이터로 SQL 서버 2008, 쓴 몇 년 전 형, 300 만 행 텍스트 파일에서 스트리밍.

    당신이 처음에 SqlBulkCopy의를 호출하여 수행하려는 작업에 따라, 그것은 테이블 반환 매개 변수 (TVP)를 사용하는 것이 더 적합 할 수 있습니다. TVP를 사용하는 것은 사소한 사용자 정의 형식의 컬렉션에 보낼 수 있도록한다. 데이터는 (많은 @Marc Gravell의 대답처럼) 당신이 DataTable을 피할 수 있도록에서 스트리밍 할 수 있으며뿐만 아니라 SqlBulkCopy의를 피할 수 있습니다. TVP 년대는 저장 프로 시저에 TVP 데이터를 전달하기 위해 전화로는 SQL 서버에 도달하고 당신이 아니라 INSERT합니다 (인으로 아무것도 할 수있는 테이블 변수로 표시하면 데이터를 처리하는 방법을 완전히 유연성을 허용 SqlBulkCopy의를 가진 경우). 또한 데이터는 새로 생성 된 IDENTITY 값 등의 SqlDataReader 개체를 통해 데이터를 백업 할 수 있습니다. 나는 예를 들어,이 대답에 몇 가지 추가 메모를 추가 : 어떻게 가능한 짧은 시간에 1000 만 개 기록을 삽입 할 수 있습니다? 그리고 정의의 일반 목록에 전달하는 작업 예제를 제공 또한 링크 대답에 기록됩니다 SQL Server 중앙에 대한 기사 (무료 등록 필요), 응용 프로그램에서 스트리밍 데이터로 SQL 서버 2008, 쓴 몇 년 전 형, 300 만 행 텍스트 파일에서 스트리밍.

  5. from https://stackoverflow.com/questions/3913371/sqlbulkcopy-from-a-list by cc-by-sa and MIT license