2014-03-04 24 views
3

我正在做一個從Excel電子表格數據的SQL批量複製到臨時表,然後從臨時表到生產數據庫。SQLBulkCopy在失敗時上傳任何數據嗎?

我的問題是,如果由於任何原因上傳失敗或者臨時表或生產數據庫,事務回滾,沒有數據被導入或修改現有數據?

回答

4

默認SqlBulkCopy將回滾到您完成的last batch。如果BatchSize的默認值爲BatchSize,它將在單個批次中完成所有操作,但如果批次的上傳時間過長(默認爲30秒),則可能獲得a timeout

另一種選擇是將整個事件封裝在外部事務中,並將它傳遞給constructor。這將回滾整個插入操作而不是最後一個批處理,這允許您使用較小的批處理,但仍然將整個插入操作作爲單個事務處理。這也允許您使用相同的事務將數據從臨時登臺表移入到實時數據中。

這裏是一個SNIPPIT taken from the MSDN

using (SqlConnection destinationConnection = new SqlConnection(connectionString)) 
{ 
    destinationConnection.Open(); 

    using (SqlTransaction transaction = destinationConnection.BeginTransaction()) 
    { 
     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(
        destinationConnection, SqlBulkCopyOptions.KeepIdentity, 
        transaction)) 
     { 
      bulkCopy.BatchSize = 10; 
      bulkCopy.DestinationTableName = "dbo.BulkCopyDemoMatchingColumns"; 

      // Write from the source to the destination. 
      // This should fail with a duplicate key error. 
      try 
      { 
       bulkCopy.WriteToServer(reader); 
       transaction.Commit(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
       transaction.Rollback(); 
      } 
      finally 
      { 
       reader.Close(); 
      } 
     } 
    } 
} 
+0

Ive得到了約55000行和havent有超時。似乎它正在做我想做的事情,並在失敗後回滾,因爲它佔了一個批量大小。 – Jeff