0

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

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

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

4

2 回答 2

2

[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 的下一个幂,这意味着在二进制(最后一列)中,它们的位是完全互斥的。

这意味着您可以将它们组合在一起,让您看到每个值都已设置,例如,如果您想要KeepIdentityand TableLock,那就是0x01with 0x04。我们使用 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 的幂:互斥(速记和组合值除外)。

于 2015-04-01T01:14:36.297 回答
1

原理与数字完全相同enum,因为 an 的基础类型enum始终是整数类型。如果您查看 的声明SqlBulkCopyOptions您会发现它的成员具有两个的幂的基础值,因此它们可以以这种方式组合。

于 2015-04-01T01:13:48.923 回答