web-dev-qa-db-ja.com

SqlBulkCopy-予期しない既存のトランザクション

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.

なぜこの例外が発生するのですか?

19
1110

「予期しない既存のトランザクション」...なぜこの例外が発生するのですか?

これは、トランザクションを指定せずにSqlBulkCopyコンストラクターを使用すると、内部で独自のトランザクションが作成されるために発生します。

トランザクションを作成してこれを回避し、それを使用してSqlBulkCopyを作成します。 SqlBulkCopyは、次のように、使用するトランザクションで作成できます。

connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
    using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
    {
37
jltrem

トランザクションを取り込むコンストラクター を使用する必要があるため、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;

   }
}
4