失败时,SQLBulkCopy是否会上传任何数据?

我正在从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();
            }
        }
    }
}
上一篇:导致死锁的SQLBulkCopy


下一篇:c#-在事务内部插入SqlBulkCopy会阻止对表进行任何其他写操作