SqlBulkCopy
を使用して大量のデータを挿入しています。
try
{
using (var bulkCopy = new SqlBulkCopy(connection))
{
connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
bulkCopy.DestinationTableName = "table";
bulkCopy.ColumnMappings.Add("...", "...");
using (var dataReader = new ObjectDataReader<MyObject>(data))
{
bulkCopy.WriteToServer(dataReader);
}
tran.Commit();
return true;
}
}
}
catch (Exception ex)
{
return false;
}
しかし、私は常に例外を受け取ります:
Unexpected existing transaction.
なぜこの例外が発生するのですか?
「予期しない既存のトランザクション」...なぜこの例外が発生するのですか?
これは、トランザクションを指定せずにSqlBulkCopy
コンストラクターを使用すると、内部で独自のトランザクションが作成されるために発生します。
トランザクションを作成してこれを回避し、それを使用してSqlBulkCopy
を作成します。 SqlBulkCopy
は、次のように、使用するトランザクションで作成できます。
connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
{
トランザクションを取り込むコンストラクター を使用する必要があるため、SqlBulkCopyはトランザクションを認識します。
connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
{
bulkCopy.DestinationTableName = "table";
bulkCopy.ColumnMappings.Add("...", "...");
using (var dataReader = new ObjectDataReader<MyObject>(data))
{
bulkCopy.WriteToServer(dataReader);
}
tran.Commit();
return true;
}
}