3
我正在做一個從Excel電子表格數據的SQL批量複製到臨時表,然後從臨時表到生產數據庫。SQLBulkCopy在失敗時上傳任何數據嗎?
我的問題是,如果由於任何原因上傳失敗或者臨時表或生產數據庫,事務回滾,沒有數據被導入或修改現有數據?
我正在做一個從Excel電子表格數據的SQL批量複製到臨時表,然後從臨時表到生產數據庫。SQLBulkCopy在失敗時上傳任何數據嗎?
我的問題是,如果由於任何原因上傳失敗或者臨時表或生產數據庫,事務回滾,沒有數據被導入或修改現有數據?
默認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();
}
}
}
}
Ive得到了約55000行和havent有超時。似乎它正在做我想做的事情,並在失敗後回滾,因爲它佔了一個批量大小。 – Jeff