zoukankan      html  css  js  c++  java
  • 【转】批量复制操作(SqlBulkCopy)的出错处理:事务提交、回滚

    原文地址:http://blog.csdn.net/westsource/article/details/6658109

      默认情况下,批量复制操作作为独立的操作执行。 批量复制操作以非事务性方式发生,不可能使其回滚。 如果需要在出错时回滚全部批量复制或它的一部分,可以使用 SqlBulkCopy 托管的事务,在现有事务中执行批量复制操作,或者在 System.Transactions Transaction 中登记它。

         由于不同批次在不同事务中执行,因此,如果在批量复制操作期间发生错误,则当前批次中的所有行都将被回滚,但以前批次中的行将保留在数据库中。 (在错误点之前复制的所有批次都被提交;回滚当前复制的批次,并且在处理任何其他批次前中止批量复制操作。)

    比如:批量复制100条数据到数据库汇总,batchsize设置为10.则没10条数据复制作为一个事务,整个100条数据的复制操作被分割为10个独立的事务。如果复制到第56条数据时(第6个事务),出错了。则前50条数据提交到数据库中,只回滚出错的事务。

         如果由于发生错误而需要回滚整个批量复制操作,或者批量复制应作为更大的可回滚进程的一部分执行,则可以将 SQLTransaction 对象提供给 SqlBulkCopy 构造函数.

      示例:

    using (SqlConnection destinationConnection = new SqlConnection(connectionString))
                {
                    destinationConnection.Open();
     
                    using (SqlTransaction transaction = destinationConnection.BeginTransaction())
                    {
                        using (SqlBulkCopy bulkCopy = new SqlBulkCopy( destinationConnection, SqlBulkCopyOptions.Default,
                                   transaction))
                        {
                            bulkCopy.BatchSize = 10;
                            bulkCopy.DestinationTableName = "dbo.BulkCopyDemoMatchingColumns";
    
                            try
                            {
                                bulkCopy.WriteToServer(reader);
                                transaction.Commit();
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(ex.Message);
                                transaction.Rollback();
                            }
                            finally
                            {
                                reader.Close();
                            }
                        }
                    }
                }

    SqlBulkCopyOptions 属性成员:

    Default 对所有选项使用默认值。
      KeepIdentity 保留源标识值。如果未指定,则由目标分配标识值。
      CheckConstraints 请在插入数据的同时检查约束。默认情况下,不检查约束。
      TableLock 在批量复制操作期间获取批量更新锁。如果未指定,则使用行锁。
      KeepNulls 保留目标表中的空值,而不管默认值的设置如何。如果未指定,则空值将由默认值替换(如果适用)。
      FireTriggers 指定后,会导致服务器为插入到数据库中的行激发插入触发器。
      UseInternalTransaction 如果已指定,则每一批批量复制操作将在事务中发生。如果指示了此选项,并且为构造函数提供了 SqlTransaction 对象,则发生 ArgumentException

    详细请查阅:

    http://msdn.microsoft.com/zh-cn/dynamics/tchktcdk.aspx

    http://msdn.microsoft.com/zh-cn/partners/system.data.sqlclient.sqlbulkcopyoptions.aspx

  • 相关阅读:
    在Centos 7下编译openwrt+njit-client
    开博随笔
    Chapter 6. Statements
    Chapter 4. Arrays and Pointers
    Chapter 3. Library Types
    Chapter 2.  Variables and Basic Types
    关于stm32不常用的中断,如何添加, 比如timer10 timer11等
    keil 报错 expected an identifier
    案例分析 串口的地不要接到电源上 会烧掉
    案例分析 CAN OPEN 调试记录 进度
  • 原文地址:https://www.cnblogs.com/ZXdeveloper/p/4136617.html
Copyright © 2011-2022 走看看