【问题标题】:Bitwise OR to define SqlBulkCopyOptions?按位或定义 SqlBulkCopyOptions?
【发布时间】:2015-04-01 01:06:23
【问题描述】:

所以我向我的一位高级开发人员寻求帮助以找出与事务范围相关的问题,他来到我的办公桌前,在 SqlBulkCopy 和 SqlBulkCopyOptions 参数上使用了不同的重载,他做了如下操作:

SqlBulkCopyOptions options = (SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints);

现在可以了,但我不明白 bitwise or 在这里的含义。我以为我对它有所了解,从未真正使用过它,但是这种用法让我摸不着头脑。是的,我没有让我的前辈向我解释。我希望有人能帮助我理解声明的含义。网上的大多数按位或示例都有一些数字,我得到了(我认为),但是这个?

【问题讨论】:

    标签: c# sqlbulkcopy bitwise-or


    【解决方案1】:

    如果枚举具有[Flags] 属性并且具有相互独立的枚举值,则可以将其用作标志:

    SqlBulkCopyOptions的定义在这里:https://github.com/Microsoft/referencesource/blob/master/System.Data/System/Data/SqlClient/SqlBulkCopyOptions.cs

    忽略移位语法的使用。实际值为:

    Name              Hex  Dec  Pow 2   Binary
    Default          =  0 =  0 =    0 = 00000000
    KeepIdentity     =  1 =  1 =    1 = 00000001
    CheckConstraints =  2 =  2 =    2 = 00000010
    TableLock        =  4 =  4 =    3 = 00000100
    KeepNulls        =  8 =  8 =    4 = 00001000
    FireTriggers     = 10 = 16 =    5 = 00010000
    UseInternalTxn   = 20 = 32 =    6 = 00100000
    

    请注意,每个值都是 2 的下一个幂,这意味着在二进制(最后一列)中,它们的位是完全互斥的。

    这意味着您可以将它们组合在一起,让您看到每个值的设置,例如,如果您想要KeepIdentityTableLock,那就是0x010x04。我们使用 OR 运算符,但基于每比特,这为我们提供了我们想要的行为:

    二进制:

    00000001
    00000100 OR
    --------
    00000101
    

    观察第一个和第三个比特现在是1

    因此,(KeepIdentity | TableLock == 5)。

    此方法不适用于不是 2 的幂的枚举值,例如,如果 KeepIdentity 的值为 1CheckConstraints 的值为 2TableLock 的值为3,然后在二进制中它们是:

    00000001 KeepIdentity
    00000010 CheckConstraints
    00000011 TableLock
    

    观察到,通过分析00000011 的位,无法确定这是KeepIdentityCheckConstraints 的组合,还是单个TableLock 值。这就是为什么 flags 枚举值必须是:1. 2 和 2 的幂:互斥(速记和组合值除外)。

    【讨论】:

      【解决方案2】:

      enum 的原理与数字完全相同,因为 enum 的基础类型始终是整数类型。如果您查看SqlBulkCopyOptionsdeclaration,您会发现其成员的基础值是2 的幂,因此可以通过这种方式组合它们。

      【讨论】:

      • 我不想说在这篇文章之前我不知道你发布的那个链接。这是一个很棒的资源!谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多