我正在从excel电子表格到临时表,然后从临时表到生产数据库的sql批量复制数据.
我的问题是,如果由于某种原因上传到临时表或生产数据库失败,是否事务回滚并且没有数据导入或修改现有数据?
解决方法:
默认情况下,SqlBulkCopy将回滚到您完成的last batch.如果您的BatchSize为0(默认值),它将在单个批处理中全部完成,但是如果该批处理花费的时间太长(默认为30秒),则可能会得到a timeout.
另一种选择是将整个内容包装在外部事务中,然后传递给constructor.这将在发生错误时回滚整个插入操作,而不仅仅是最后一批,这使您可以使用较小的批处理,但仍具有整个插入操作是单笔交易.这也使您可以使用同一事务将数据从临时登台表移到实时数据中.
这是一个代码片段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();
}
}
}
}