SqlBulkCopy クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
別のソースからのデータを 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 System.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;";
}
}
Imports System.Data.SqlClient
Module Module1
Sub Main()
Dim connectionString As String = GetConnectionString()
' Open a connection to the AdventureWorks database.
Using sourceConnection As SqlConnection = _
New SqlConnection(connectionString)
sourceConnection.Open()
' Perform an initial count on the destination table.
Dim commandRowCount As New SqlCommand( _
"SELECT COUNT(*) FROM dbo.BulkCopyDemoMatchingColumns;", _
sourceConnection)
Dim countStart As Long = _
System.Convert.ToInt32(commandRowCount.ExecuteScalar())
Console.WriteLine("Starting row count = {0}", countStart)
' Get data from the source table as a SqlDataReader.
Dim commandSourceData As New SqlCommand( _
"SELECT ProductID, Name, ProductNumber " & _
"FROM Production.Product;", sourceConnection)
Dim reader As SqlDataReader = 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 destinationConnection As SqlConnection = _
New SqlConnection(connectionString)
destinationConnection.Open()
' Set up the bulk copy object.
' 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 bulkCopy As SqlBulkCopy = _
New SqlBulkCopy(destinationConnection)
bulkCopy.DestinationTableName = _
"dbo.BulkCopyDemoMatchingColumns"
Try
' Write from the source to the destination.
bulkCopy.WriteToServer(reader)
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
' Close the SqlDataReader. The SqlBulkCopy
' object is automatically closed at the end
' of the Using block.
reader.Close()
End Try
End Using
' Perform a final count on the destination table
' to see how many rows were added.
Dim countEnd As Long = _
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()
End Using
End Using
End Sub
Private Function GetConnectionString() As String
' 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;"
End Function
End Module
注釈
Microsoft SQL Serverには、1 つのサーバー上でもサーバー間でも、あるテーブルから別のテーブルにデータを移動するための bcp という名前の一般的なコマンド プロンプト ユーティリティが含まれています。 この SqlBulkCopy クラスを使用すると、同様の機能を提供するマネージド コード ソリューションを記述できます。 SQL Server テーブルにデータを読み込む方法は他にもありますが (INSERT ステートメントなど)、SqlBulkCopy を使用する方が大幅にパフォーマンスが向上します。
SqlBulkCopy クラスは、SQL Server テーブルのみにデータを書き込む場合に使用できます。 ただし、データ ソースはSQL Serverに限定されません。データ をインスタンスに読み込んだり、インスタンスで読み取DataTableったりできる限り、任意のデータ ソースをIDataReader使用できます。
SqlBulkCopyは、型が 2008 年SQL Server追加された日付/時刻型SqlDateTimeの 1 つであるSQL Server列に型の列を一括読み込みDataTableすると失敗します。
コンストラクター
SqlBulkCopy(SqlConnection) |
SqlBulkCopy の指定されたオープン インスタンスを使用して、SqlConnection クラスの新しいインスタンスを初期化します。 |
SqlBulkCopy(SqlConnection, SqlBulkCopyOptions, SqlTransaction) |
既に接続の確立されている SqlBulkCopy のインスタンスを使用し、SqlConnection クラスの新しいインスタンスを初期化します。 SqlBulkCopy のインスタンスは、 |
SqlBulkCopy(String) |
指定された |
SqlBulkCopy(String, SqlBulkCopyOptions) |
指定された |
プロパティ
BatchSize |
バッチごとに処理される行数。 各バッチ処理の最後に、そこで処理された行がサーバーに送信されます。 |
BulkCopyTimeout |
操作がタイムアウトするまでの秒数。 |
ColumnMappings |
SqlBulkCopyColumnMapping は項目のコレクションを返します。 列マッピングは、データ ソース中の列とターゲット中の列の間の関係を定義します。 |
DestinationTableName |
サーバー上のコピー先テーブルの名前。 |
EnableStreaming |
IDataReader オブジェクトからデータをストリーミングする SqlBulkCopy オブジェクトを有効または無効にします。 |
NotifyAfter |
通知イベントを生成する前に処理する行の数を定義します。 |
メソッド
イベント
SqlRowsCopied |
NotifyAfter プロパティによって指定された行数が処理されるたびに発生します。 |
明示的なインターフェイスの実装
IDisposable.Dispose() |
SqlBulkCopy クラスの現在のインスタンスによって使用されているすべてのリソースを解放します。 |