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 テーブルのデータを、同じデータベース内の同等のテーブルにコピーします。

重要

このサンプルは、「バルク コピー サンプルのセットアップ」で説明されているように作業テーブルを作成してからでないと動作しません。 このコードでは、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 には、1 つのサーバー上でもサーバー間でも、あるテーブルから別のテーブルにデータを移動するための bcp という名前の一般的なコマンド プロンプト ユーティリティが含まれています。 SqlBulkCopyクラスを使用すると、同様の機能を提供するマネージ コード ソリューションを記述できます。 SQL Server テーブルにデータを読み込む方法は他にもありますが (INSERT ステートメントなど)、SqlBulkCopy を使用する方が大幅にパフォーマンスが向上します。 SqlBulkCopy クラスは、SQL Server テーブルのみにデータを書き込む場合に使用できます。 ただし、データ ソースはSQL Serverに限定されません。データ をインスタンスに読み込んだり、インスタンスで読み取DataTableったりできる限り、任意のデータ ソースをIDataReader使用できます。 SqlBulkCopy型が 2008 年に追加された日付/時刻型SqlDateTimeの 1 つであるSQL Server列に型の列 SQL Serverを一括読み込みDataTableすると失敗します。

コンストラクター

SqlBulkCopy(SqlConnection)

指定した の開いているインスタンスを SqlBulkCopy 使用して、 クラスの SqlConnection 新しいインスタンスを初期化します。

SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction)

指定した の既存のオープン インスタンスを SqlBulkCopy 使用して、 クラスの SqlConnection 新しいインスタンスを初期化します。 インスタンスは SqlBulkCopy 、 で指定されたオプションに従って動作します。copyOptions パラメーター。 null 以外の SqlTransaction が指定された場合、コピー操作はトランザクション内で実行されます。

SqlBulkCopy(String)

指定された に基づいて の SqlConnection 新しいインスタンスを初期化して開きます。connectionString . コンストラクターは、SqlConnection を使用して、SqlBulkCopy クラスの新しいインスタンスを初期化します。

SqlBulkCopy(String, SqlBulkCopyOptions)

指定された に基づいて の SqlConnection 新しいインスタンスを初期化して開きます。connectionString . このコンストラクターは、SqlConnection を使用して、SqlBulkCopy クラスの新しいインスタンスを初期化します。 インスタンスは SqlConnection 、 で指定されたオプションに従って動作します。copyOptions パラメーター。

プロパティ

BatchSize

各バッチに含まれる行数。 各バッチの最後に、バッチ内の行がサーバーに送信されます。

BulkCopyTimeout

操作がタイムアウトするまでの秒数。

ColumnMappings

SqlBulkCopyColumnMapping は項目のコレクションを返します。 列マッピングは、データ ソース中の列とターゲット中の列の間の関係を定義します。

ColumnOrderHints

SqlBulkCopyColumnOrderHint は項目のコレクションを返します。 列の順序ヒントは、変換先テーブルのクラスター化インデックス内の列の並べ替え順序を表します。

DestinationTableName

サーバー上にあるコピー先のテーブルの名前。

EnableStreaming

IDataReader オブジェクトからデータをストリーミングする SqlBulkCopy オブジェクトを有効または無効にします。

NotifyAfter

通知イベントを生成する前に処理する行の数を定義します。

RowsCopied

進行中の一括コピー操作で処理された行の数。

RowsCopied64

進行中の一括コピー操作で処理された行の数。

メソッド

Close()

SqlBulkCopy インスタンスを閉じます。

WriteToServer(DataRow[])

示された DataRow 配列から、SqlBulkCopy オブジェクトの DestinationTableName のプロパティで指定された宛先のテーブルにすべての行をコピーします。

WriteToServer(DataTable)

指定された DataTable のすべての行を、SqlBulkCopy オブジェクトの DestinationTableName プロパティで指定される宛先テーブルにコピーします。

WriteToServer(DataTable, DataRowState)

提供された DataTable 内の提供された行の状態と一致する行のみを、SqlBulkCopy オブジェクトの DestinationTableName のプロパティで指定されたコピー先のテーブルにコピーします。

WriteToServer(DbDataReader)

示された DbDataReader 配列から、SqlBulkCopy オブジェクトの DestinationTableName のプロパティで指定された宛先のテーブルにすべての行をコピーします。

WriteToServer(IDataReader)

指定された IDataReader のすべての行を、SqlBulkCopy オブジェクトの DestinationTableName プロパティで指定される宛先テーブルにコピーします。

WriteToServerAsync(DataRow[])

非同期バージョンの WriteToServer(DataRow[])。指定された DataRow 配列から、SqlBulkCopy オブジェクトの DestinationTableName プロパティで指定されたコピー先テーブルにすべての行をコピーします。

WriteToServerAsync(DataRow[], CancellationToken)

非同期バージョンの WriteToServer(DataRow[])。指定された DataRow 配列から、SqlBulkCopy オブジェクトの DestinationTableName プロパティで指定されたコピー先テーブルにすべての行をコピーします。

キャンセル トークンを使用すると、コマンド タイムアウトが経過する前に操作を破棄するように要求できます。 例外は、返されたタスク オブジェクトによって報告されます。

WriteToServerAsync(DataTable)

WriteToServer(DataTable) の非同期バージョン。指定した DataTable のすべての行を、DestinationTableName オブジェクトの SqlBulkCopy プロパティで指定された対象テーブルにコピーします。

WriteToServerAsync(DataTable, CancellationToken)

WriteToServer(DataTable) の非同期バージョン。指定した DataTable のすべての行を、DestinationTableName オブジェクトの SqlBulkCopy プロパティで指定された対象テーブルにコピーします。

キャンセル トークンを使用すると、コマンド タイムアウトが経過する前に操作を破棄するように要求できます。 例外は、返されたタスク オブジェクトによって報告されます。

WriteToServerAsync(DataTable, DataRowState)

非同期バージョンの WriteToServer(DataTable, DataRowState)。提供された DataTable 内の提供された行の状態と一致する行のみを、SqlBulkCopy オブジェクトの DestinationTableName のプロパティで指定されたコピー先のテーブルにコピーします。

WriteToServerAsync(DataTable, DataRowState, CancellationToken)

非同期バージョンの WriteToServer(DataTable, DataRowState)。提供された DataTable 内の提供された行の状態と一致する行のみを、SqlBulkCopy オブジェクトの DestinationTableName のプロパティで指定されたコピー先のテーブルにコピーします。

キャンセル トークンを使用すると、コマンド タイムアウトが経過する前に操作を破棄するように要求できます。 例外は、返されたタスク オブジェクトによって報告されます。

WriteToServerAsync(DbDataReader)

WriteToServer(IDataReader) の非同期バージョン。指定した IDataReader のすべての行を、DestinationTableName オブジェクトの SqlBulkCopy プロパティで指定された対象テーブルにコピーします。

WriteToServerAsync(DbDataReader, CancellationToken)

非同期バージョンの WriteToServer(DbDataReader)。指定された DbDataReader 配列から、SqlBulkCopy オブジェクトの DestinationTableName プロパティで指定されたコピー先テーブルにすべての行をコピーします。

キャンセル トークンを使用すると、コマンド タイムアウトが経過する前に操作を破棄するように要求できます。 例外は、返されたタスク オブジェクトによって報告されます。

WriteToServerAsync(IDataReader)

WriteToServer(IDataReader) の非同期バージョン。指定した IDataReader のすべての行を、DestinationTableName オブジェクトの SqlBulkCopy プロパティで指定された対象テーブルにコピーします。

WriteToServerAsync(IDataReader, CancellationToken)

WriteToServer(IDataReader) の非同期バージョン。指定した IDataReader のすべての行を、DestinationTableName オブジェクトの SqlBulkCopy プロパティで指定された対象テーブルにコピーします。

キャンセル トークンを使用すると、コマンド タイムアウトが経過する前に操作を破棄するように要求できます。 例外は、返されたタスク オブジェクトによって報告されます。

イベント

SqlRowsCopied

NotifyAfter プロパティによって指定された行数が処理されるたびに発生します。

明示的なインターフェイスの実装

IDisposable.Dispose()

SqlBulkCopy クラスの現在のインスタンスによって使用されているすべてのリソースを解放します。

適用対象