SqlBulkCopy 클래스

정의

다른 원본의 데이터를 사용하여 SQL Server 테이블을 효율적으로 대량 로드할 수 있습니다.

public ref class SqlBulkCopy sealed : IDisposable
public sealed class SqlBulkCopy : IDisposable
type SqlBulkCopy = class
    interface IDisposable
Public NotInheritable Class SqlBulkCopy
Implements IDisposable
상속
SqlBulkCopy
구현

예제

다음 콘솔 애플리케이션에서는 SqlBulkCopy 클래스를 사용하여 데이터를 로드하는 방법을 보여 줍니다. 이 예제에서는 SqlDataReader를 사용하여 SQL Server AdventureWorks 데이터베이스에 있는 Production.Product 테이블의 데이터를 같은 데이터베이스의 비슷한 테이블로 복사합니다.

Important

작업 테이블을 대량 복사 예제 설정에 설명된 대로 생성하지 않으면 이 샘플은 실행되지 않습니다.

이 코드는 SqlBulkCopy를 사용하는 구문을 보여 주는 용도로 제공됩니다. 원본 및 대상 테이블이 동일한 SQL Server 인스턴스에 있는 경우 Transact-SQL INSERT … SELECT 문을 사용하여 데이터를 복사하는 것이 더 쉽고 빠릅니다.

using Microsoft.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = GetConnectionString();
        // Open a sourceConnection to the AdventureWorks database.
        using (SqlConnection sourceConnection =
                   new SqlConnection(connectionString))
        {
            sourceConnection.Open();

            // Perform an initial count on the destination table.
            SqlCommand commandRowCount = new SqlCommand(
                "SELECT COUNT(*) FROM " +
                "dbo.BulkCopyDemoMatchingColumns;",
                sourceConnection);
            long countStart = System.Convert.ToInt32(
                commandRowCount.ExecuteScalar());
            Console.WriteLine("Starting row count = {0}", countStart);

            // Get data from the source table as a SqlDataReader.
            SqlCommand commandSourceData = new SqlCommand(
                "SELECT ProductID, Name, " +
                "ProductNumber " +
                "FROM Production.Product;", sourceConnection);
            SqlDataReader reader =
                commandSourceData.ExecuteReader();

            // Open the destination connection. In the real world you would 
            // not use SqlBulkCopy to move data from one table to the other 
            // in the same database. This is for demonstration purposes only.
            using (SqlConnection destinationConnection =
                       new SqlConnection(connectionString))
            {
                destinationConnection.Open();

                // Set up the bulk copy object. 
                // Note that the column positions in the source
                // data reader match the column positions in 
                // the destination table so there is no need to
                // map columns.
                using (SqlBulkCopy bulkCopy =
                           new SqlBulkCopy(destinationConnection))
                {
                    bulkCopy.DestinationTableName =
                        "dbo.BulkCopyDemoMatchingColumns";

                    try
                    {
                        // Write from the source to the destination.
                        bulkCopy.WriteToServer(reader);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                    finally
                    {
                        // Close the SqlDataReader. The SqlBulkCopy
                        // object is automatically closed at the end
                        // of the using block.
                        reader.Close();
                    }
                }

                // Perform a final count on the destination 
                // table to see how many rows were added.
                long countEnd = System.Convert.ToInt32(
                    commandRowCount.ExecuteScalar());
                Console.WriteLine("Ending row count = {0}", countEnd);
                Console.WriteLine("{0} rows were added.", countEnd - countStart);
                Console.WriteLine("Press Enter to finish.");
                Console.ReadLine();
            }
        }
    }

    private static string GetConnectionString()
    // To avoid storing the sourceConnection string in your code, 
    // you can retrieve it from a configuration file. 
    {
        return "Data Source=(local); " +
            " Integrated Security=true;" +
            "Initial Catalog=AdventureWorks;";
    }
}

설명

Microsoft SQL Server 단일 서버 또는 서버 간에 데이터를 한 테이블에서 다른 테이블로 이동하기 위한 bcp이라는 인기 있는 명령 프롬프트 유틸리티를 포함합니다. 클래스를 SqlBulkCopy 사용하면 비슷한 기능을 제공하는 관리 코드 솔루션을 작성할 수 있습니다. INSERT 문과 같은 다른 방법을 사용하여 데이터를 SQL Server 테이블에 로드할 수 있지만 SqlBulkCopy는 훨씬 더 향상된 성능을 제공합니다. SqlBulkCopy 클래스는 SQL Server 테이블에만 데이터를 쓰는 데 사용할 수 있습니다. 그러나 데이터 원본은 SQL Server 제한되지 않습니다. 데이터가 DataTable 인스턴스에 로드되거나 IDataReader 인스턴스로 읽을 수 있는 한 모든 데이터 원본을 사용할 수 있습니다. SqlBulkCopy 형식의 DataTable 열을 SqlDateTime 형식이 SQL Server 2008년에 추가된 날짜/시간 형식 중 하나인 SQL Server 열로 대량 로드할 때 실패합니다.

생성자

Name Description
SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)

제공된 기존 열린 인스턴스를 SqlBulkCopy 사용하여 클래스의 새 인스턴스를 초기화합니다 SqlConnection. 인스턴스는 SqlBulkCopy 매개 변수에 제공된 옵션에 따라 동작합니다 copyOptions . null SqlTransaction 이 아닌 작업이 제공되면 해당 트랜잭션 내에서 복사 작업이 수행됩니다.

SqlBulkCopy(SqlConnection)

SqlBulkCopy의 지정된 열린 인스턴스를 사용하여 SqlConnection 클래스의 새 인스턴스를 초기화합니다.

SqlBulkCopy(String, SqlBulkCopyOptions)

지정된 SqlConnection을 기반으로 connectionString의 새 인스턴스를 초기화하고 엽니다. 생성자는 이를 SqlConnection 사용하여 클래스의 새 인스턴스를 초기화합니다 SqlBulkCopy . 인스턴스는 SqlConnection 매개 변수에 제공된 옵션에 따라 동작합니다 copyOptions .

SqlBulkCopy(String)

지정된 SqlConnection을 기반으로 connectionString의 새 인스턴스를 초기화하고 엽니다. 생성자는 SqlConnection을 사용하여 SqlBulkCopy 클래스의 새 인스턴스를 초기화합니다.

속성

Name Description
BatchSize

각 일괄 처리의 행 수입니다. 각 일괄 처리가 끝나면 일괄 처리의 행이 서버로 보내집니다.

BulkCopyTimeout

시간이 초과되기 전에 작업이 완료되는 시간(초)입니다.

ColumnMappings

항목 컬렉션을 SqlBulkCopyColumnMapping 반환합니다. 열 매핑은 데이터 원본의 열과 대상의 열 간 관계를 정의합니다.

ColumnOrderHints

항목 컬렉션을 SqlBulkCopyColumnOrderHint 반환합니다. 열 순서 힌트는 대상 테이블의 클러스터형 인덱스에 있는 열의 정렬 순서를 설명합니다.

DestinationTableName

서버에 있는 대상 테이블의 이름입니다.

EnableStreaming

개체에서 데이터를 IDataReader 스트리밍하도록 개체를 사용하거나 사용하지 않도록 설정합니다SqlBulkCopy.

NotifyAfter

알림 이벤트를 생성하기 전에 처리할 행 수를 정의합니다.

RowsCopied

진행 중인 대량 복사 작업에서 처리된 행 수입니다.

RowsCopied64

진행 중인 대량 복사 작업에서 처리된 행 수입니다.

메서드

Name Description
ClearCachedMetadata()

옵션을 사용할 때 캐시된 대상 테이블 메타데이터를 CacheMetadata 지웁니다.

Close()

SqlBulkCopy 인스턴스를 닫습니다.

WriteToServer(DataRow[])

제공된 DataRow 배열의 모든 행을 개체의 SqlBulkCopy 속성으로 지정된 대상 테이블로 DestinationTableName 복사합니다.

WriteToServer(DataTable, DataRowState)

개체의 속성 SqlBulkCopy 에 지정된 DestinationTableName 대상 테이블에 제공된 DataTable 행 상태와 일치하는 행만 복사합니다.

WriteToServer(DataTable)

제공된 DataTable의 모든 행을 DestinationTableName 개체의 SqlBulkCopy 속성으로 지정된 대상 테이블에 복사합니다.

WriteToServer(DbDataReader)

제공된 DbDataReader 배열의 모든 행을 개체의 SqlBulkCopy 속성으로 지정된 대상 테이블로 DestinationTableName 복사합니다.

WriteToServer(IDataReader)

제공된 IDataReader의 모든 행을 DestinationTableName 개체의 SqlBulkCopy 속성으로 지정된 대상 테이블에 복사합니다.

WriteToServerAsync(DataRow[], CancellationToken)

제공된 DataRow 배열의 모든 행을 개체의 WriteToServer(DataRow[])속성 SqlBulkCopy 으로 지정된 DestinationTableName 대상 테이블로 복사하는 비동기 버전입니다. 취소 토큰을 사용하여 명령 시간 제한이 경과하기 전에 작업을 중단하도록 요청할 수 있습니다. 반환된 Task 개체를 통해 예외가 보고됩니다.

WriteToServerAsync(DataRow[])

제공된 DataRow 배열의 모든 행을 개체의 WriteToServer(DataRow[])속성 SqlBulkCopy 으로 지정된 DestinationTableName 대상 테이블로 복사하는 비동기 버전입니다.

WriteToServerAsync(DataTable, CancellationToken)

개체의 WriteToServer(DataTable)속성에 지정된 DestinationTableName 대상 테이블에 제공된 DataTable 모든 행을 복사하는 비동 SqlBulkCopy 기 버전입니다. 취소 토큰을 사용하여 명령 시간 제한이 경과하기 전에 작업을 중단하도록 요청할 수 있습니다. 반환된 Task 개체를 통해 예외가 보고됩니다.

WriteToServerAsync(DataTable, DataRowState, CancellationToken)

개체의 WriteToServer(DataTable, DataRowState)속성으로 지정된 DestinationTableName 대상 테이블에 제공 DataTable 된 행 상태와 일치하는 행만 복사하는 비동 SqlBulkCopy 기 버전입니다. 취소 토큰을 사용하여 명령 시간 제한이 경과하기 전에 작업을 중단하도록 요청할 수 있습니다. 반환된 Task 개체를 통해 예외가 보고됩니다.

WriteToServerAsync(DataTable, DataRowState)

개체의 WriteToServer(DataTable, DataRowState)속성으로 지정된 DestinationTableName 대상 테이블에 제공 DataTable 된 행 상태와 일치하는 행만 복사하는 비동 SqlBulkCopy 기 버전입니다.

WriteToServerAsync(DataTable)

개체의 WriteToServer(DataTable)속성에 지정된 DestinationTableName 대상 테이블에 제공된 DataTable 모든 행을 복사하는 비동 SqlBulkCopy 기 버전입니다.

WriteToServerAsync(DbDataReader, CancellationToken)

제공된 DbDataReader 배열의 모든 행을 개체의 WriteToServer(DbDataReader)속성 SqlBulkCopy 으로 지정된 DestinationTableName 대상 테이블로 복사하는 비동기 버전입니다. 취소 토큰을 사용하여 명령 시간 제한이 경과하기 전에 작업을 중단하도록 요청할 수 있습니다. 반환된 Task 개체를 통해 예외가 보고됩니다.

WriteToServerAsync(DbDataReader)

개체의 WriteToServer(IDataReader)속성에 지정된 DestinationTableName 대상 테이블에 제공된 IDataReader 모든 행을 복사하는 비동 SqlBulkCopy 기 버전입니다.

WriteToServerAsync(IDataReader, CancellationToken)

개체의 WriteToServer(IDataReader)속성에 지정된 DestinationTableName 대상 테이블에 제공된 IDataReader 모든 행을 복사하는 비동 SqlBulkCopy 기 버전입니다. 취소 토큰을 사용하여 명령 시간 제한이 경과하기 전에 작업을 중단하도록 요청할 수 있습니다. 반환된 Task 개체를 통해 예외가 보고됩니다.

WriteToServerAsync(IDataReader)

개체의 WriteToServer(IDataReader)속성에 지정된 DestinationTableName 대상 테이블에 제공된 IDataReader 모든 행을 복사하는 비동 SqlBulkCopy 기 버전입니다.

이벤트

Name Description
SqlRowsCopied

속성에 지정된 NotifyAfter 행 수가 처리될 때마다 발생합니다.

명시적 인터페이스 구현

Name Description
IDisposable.Dispose()

SqlBulkCopy 클래스의 현재 인스턴스에서 사용하는 모든 리소스를 해제합니다.

적용 대상