質問: 私は、 `SqlBulkCopyOptions.UseInternalTransaction`コピーオプションを使用した場合と使用しない場合の違いを見出そうとしていますが、テストアプリケーションでは違いは検出されません。 `BatchSize`が0の場合、レコード番号50のレコードをデータベーステーブルに追加する際にエラーが発生する100レコード( `DataTable` )を追加すると、テーブルに0レコードが追加されます。たとえば、 `BatchSize`が10に設定されている場合、40個のレコードが取得されます(10レコードのうち4バッチ、5番目のバッチには不完全なレコードが含まれ、一括コピーが中止されます)。 S `qlBulkCopyOptions.UseInternalTransaction`が設定されているかどうかは関係ありませんが、私は常に同じ結果を得ます。バッチは常に内部取引でコピーされるようです。 私のテストアプリケーションに興味があるなら、ここにあります: SqlBulkCopy-Error-and-Transaction-Test.zip 私の質問は次のとおりです: 1. ある`SqlBulkCopyOptions.UseInternalTransaction`ので時代遅れ`SqlBulkCopy`常に内部取引を使用していますか? 2. そうでない場合:このオプションの実際の意味は何ですか?どのような場合に違いが生じますか? 誰かが明確にできることを願って **編集:**答えとコメントによると、私の問題は十分にはっきりしていないと思います。私はその文書を知っている。 "デフォルトでは、一括コピー操作は独自のトランザクションです。" `UseInternalTransaction`を渡すときには、各バッチで独自のトランザクションが使用されます。しかし、デフォルトでは、一括コピー操作では一括コピー全体で1つのトランザクションしか使用されません(バッチごとに1つずつではありません)。BatchSizeを一定のサイズに設定するとレコードを取得できません。最初のエラーが発生します。 1つのトランザクションのみが使用される場合、トランザクションログに追加されたすべてのレコードはロールバックされます。しかし、私はバッチのレコードが不完全なレコードを含むバッチの前にあるバッチのレコードを取得します。これによると、デフォルトでは、各バッチが独自のトランザクションで実行されているようです。つまり、 `UseInternalTransaction`を渡すかどうかは違いはありません。私が間違った道を歩いているなら、誰かが明確にできるかどうか本当に感謝しています。 1つの事実が重要になる可能性があります。私はSQL Server 2012を使用します.SQL Server 2008の動作が異なる場合があります。私はそれを確認します。 **編集:USR**からの回答のおかげで、私は答えを見つけたと思う:私は、デバッグとプロファイリングビットをしてUseInternalTransactionが定義されていない場合はプライベートフィールド_internalTransactionが実際に設定されていないことが判明。 SqlBulkCopyは独自の(内部)トランザクションを使用しません。しかし、プロファイリングでは、SqlBulkCopyはBatchSizeに関係なくデータをコピーするためにTDS(Tabular Data Stream)を使用することが示されていました。特にSQL ServerのTDSに関する情報はほとんど見つかりませんでしたが、SQL Serverが内部トランザクションでTDS一括コピー操作を実行すると仮定します。したがって、UseInternalTransactionはSQL Serverのために冗長であるようですが、私はそれを設定するのが安全な側になるようにしています。
回答: このオプションを設定すると、SQLBulkCopyクラスはa ``` _internalTransaction = _connection.BeginTransaction(); ``` 各バッチの周り。 しかし、このオプションは、デフォルトでトランザクションが自動コミットモードで実行されるため、SQL Serverと実際的な違いはありません。 目に見える差異は、外部トランザクションで渡すこともしていないという検証を実行することだけです。 すべてのバッチが成功し、ロールバックされます。 ``` var transaction = sourceConnection.BeginTransaction(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sourceConnection, SqlBulkCopyOptions.Default, transaction)) { bulkCopy.BatchSize = 50; bulkCopy.DestinationTableName = "dbo.foobar"; bulkCopy.WriteToServer(dt); } transaction.Rollback(); ``` `SqlBulkCopyOptions.UseInternalTransaction`渡すとエラーが発生し、失敗します。 > SqlBulkCopyOption.UseInternalTransactionを指定して外部トランザクションを同時に渡すことはできません。 > > もし私が`SET IMPLICIT_TRANSACTIONS ON;`違いがあるのではないかと思った`SET IMPLICIT_TRANSACTIONS ON;`以前に接続で実行されて自動コミットモードをオフにしていましたが、接続オブジェクトを`SqlBulkCopy`する`SqlBulkCopy`コンストラクタのオーバーロードによって「予期しない既存のトランザクション」が返されます。どちらの場合でもエラーが発生し、接続文字列を受け取るオーバーロードによって新しい接続が作成されます。