SqlBulkCopy - 意外的现有事务

111*_*110 19 c# sql-server sqlbulkcopy sql-server-2008

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;
}
Run Code Online (Sandbox Code Playgroud)

但我总是得到例外:

Unexpected existing transaction.
Run Code Online (Sandbox Code Playgroud)

为什么发生这种异常?

jlt*_*rem 38

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

这是因为在SqlBulkCopy没有指定事务的情况下使用构造函数将在内部创建自己的事务.

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

connection.Open();
using (var tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
    using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, tran))
    {
Run Code Online (Sandbox Code Playgroud)


Sco*_*ain 6

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

   }
}
Run Code Online (Sandbox Code Playgroud)

  • 有没有只需要连接和事务的构造函数?我认为您缺少 BulkCopyOptions (2认同)