22

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.

为什么会发生此异常?

4

2 回答 2

47

“意外的现有交易”......为什么会发生这种异常?

发生这种情况是因为使用SqlBulkCopy构造函数而不指定事务将在内部创建自己的事务。

通过创建您的事务然后使用它来创建SqlBulkCopy. SqlBulkCopy可以使用您要使用的事务创建,如下所示:

connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
    using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
    {
于 2013-10-01T13:20:21.483 回答
7

您需要使用接受事务的构造函数,以便 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;

   }
}
于 2013-10-01T13:22:05.337 回答