SqlBulkCopy.SqlRowsCopied イベント
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
NotifyAfter プロパティによって指定された行数が処理されるたびに発生します。
public:
event Microsoft::Data::SqlClient::SqlRowsCopiedEventHandler ^ SqlRowsCopied;
public event Microsoft.Data.SqlClient.SqlRowsCopiedEventHandler SqlRowsCopied;
member this.SqlRowsCopied : Microsoft.Data.SqlClient.SqlRowsCopiedEventHandler
Public Custom Event SqlRowsCopied As SqlRowsCopiedEventHandler
Public Event SqlRowsCopied As SqlRowsCopiedEventHandler
イベントの種類
例
次のコンソール アプリケーションは、既に開いている接続を使用してデータを一括読み込みする方法を示しています。 プロパティは NotifyAfter 、テーブルにコピーされた 50 行ごとにイベント ハンドラーが呼び出されるように設定されます。
この例では、最初に接続を使用して、SQL Server テーブルからインスタンスにデータをSqlDataReader読み取る必要があります。 ソース データは、SQL Serverに配置する必要はありません。に読み込んだり、 にIDataReader読み込んだりできる任意のデータ ソースをDataTable使用できます。
重要
このサンプルは、「バルク コピー サンプルのセットアップ」で説明されているように作業テーブルを作成してからでないと動作しません。
このコードでは、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("NotifyAfter Sample");
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();
// Create the SqlBulkCopy object using a connection string.
// In the real world you would not use SqlBulkCopy to move
// data from one table to the other in the same database.
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString))
{
bulkCopy.DestinationTableName =
"dbo.BulkCopyDemoMatchingColumns";
// Set up the event handler to notify after 50 rows.
bulkCopy.SqlRowsCopied +=
new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
bulkCopy.NotifyAfter = 50;
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 void OnSqlRowsCopied(
object sender, SqlRowsCopiedEventArgs e)
{
Console.WriteLine("Copied {0} so far...", e.RowsCopied);
}
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;";
}
}
注釈
と BatchSize のNotifyAfter設定は独立しています。 イベントを受信しても、 SqlRowsCopied 行がサーバーに送信されたりコミットされたりしたことを意味するものではありません。
このイベントから SqlBulkCopy.Close (Close()) または SqlConnection.Close (Close()) を呼び出すことはできません。 これを行うと、 InvalidOperationException がスローされ、オブジェクトの SqlBulkCopy 状態は変更されません。 ユーザーが イベントから操作を取り消す場合は、 の Abort プロパティを SqlRowsCopiedEventArgs 使用できます。 (プロパティを使用する例については、「 トランザクション操作と一括コピー操作 」を参照 Abort してください)。
トランザクション アクティビティなどのアクションは、一括コピー操作の実行中に接続でサポートされていないため、イベント中 SqlRowsCopied に使用されるのと同じ接続を使用しないことをお勧めします。 ただし、別の接続を開くことができます。