按位OR来定义SqlBulkCopyOptions?

时间:2015-04-01 01:06:23

标签: c# sqlbulkcopy bitwise-or

所以我向我的一位资深开发人员寻求帮助以找出与事务范围相关的问题,他来到我的办公桌并在SqlBulkCopy上使用了不同的重载,对于SqlBulkCopyOptions参数,他做了类似下面的事情:

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

它现在有效,但我不知道bitwise or在这里意味着什么。我以为我对它有一些了解,从来没有真正使用它,但这种用法让我抓狂。是的,我没有让我的大四学生向我解释..我希望有人能帮我理解这句话的作用。网上的大多数按位或示例都有一些数字,我得到(我认为),但是这个?

2 个答案:

答案 0 :(得分:2)

如果enum具有[Flags]属性且枚举值彼此独立,则枚举可用作标志:

SqlBulkCopyOptions的定义如下:https://github.com/Microsoft/referencesource/blob/master/System.Data/System/Data/SqlClient/SqlBulkCopyOptions.cs

忽略使用bitshift语法。实际值是:

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,那么0x01可以0x04。我们使用OR运算符,但是基于每个位,它为我们提供了我们想要的行为:

二进制:

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

观察第一和第三位现在是如何1

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

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

3

观察通过分析00000001 KeepIdentity 00000010 CheckConstraints 00000011 TableLock 的位,无法确定这是00000011KeepIdentity的组合,还是单个CheckConstraints值的组合。这就是为什么标志枚举值必须是:1。2和2的幂:互斥(对于速记和组合值的例外)。

答案 1 :(得分:1)

enum与数字的原理完全相同,因为enum的基础类型始终是整数类型。如果您查看SqlBulkCopyOptions的{​​{3}},您会看到其成员的基础值为2的幂,以便它们可以以这种方式组合。