2013-10-01 29 views
16

我使用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. 

爲什麼這樣發生異常?

回答

32

「意外的現有交易」......爲什麼會發生此異常?

發生這種情況是因爲在沒有指定事務的情況下使用SqlBulkCopy構造函數將在內部創建它自己的事務。

通過創建您的交易並使用它創建SqlBulkCopy來避免這種情況。 SqlBulkCopy可以與您要使用的交易中產生,就像這樣:

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

感謝名單這對我的作品 – andy

+0

致謝,很有幫助! :) – Michael

4

您需要使用the constructor that takes in the transaction所以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; 

    } 
} 
+2

是否有一個構造函數,只需要連接和事務?我認爲你錯過了BulkCopyOptions – jltrem

+0

@jltrem好點,修復。 –