NoS*_*ler 2 c# sqlbulkcopy bitwise-or
因此,我向一位高级开发人员寻求帮助,以解决与事务范围相关的问题,他来到我的办公桌前,在 SqlBulkCopy 上使用了不同的重载,对于 SqlBulkCopyOptions 参数,他做了如下所示的操作:
SqlBulkCopyOptions options = (SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints);
Run Code Online (Sandbox Code Playgroud)
它现在有效,但我不明白bitwise or这里的意思。我以为我对它有一些了解,从来没有真正使用过它,但是这个用法让我摸不着头脑。是的,我没有要求我的前辈向我解释它。我希望有人能帮助我理解该声明的含义。网上的大多数按位或示例都带有一些数字,我得到了(我认为),但是这个?
如果枚举具有[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
Run Code Online (Sandbox Code Playgroud)
请注意,每个值都是 2 的下一个幂,这意味着在二进制(最后一列)中,它们的位是完全互斥的。
这意味着您可以以某种方式组合它们,让您看到每个值的设置,例如,如果您想要KeepIdentity和TableLock,那0x01就是0x04。我们使用 OR 运算符,但基于每个位,这为我们提供了我们想要的行为:
以二进制表示:
00000001
00000100 OR
--------
00000101
Run Code Online (Sandbox Code Playgroud)
观察第一位和第三位现在的情况1。
因此, (KeepIdentity | TableLock == 5)。
此方法不适用于不是 2 的幂的枚举值,例如,如果KeepIdentity值为1且CheckConstraints值为 ,2但TableLock值为3,则在二进制中它们是:
00000001 KeepIdentity
00000010 CheckConstraints
00000011 TableLock
Run Code Online (Sandbox Code Playgroud)
请注意,通过分析 的位,00000011无法确定这是KeepIdentity和的组合CheckConstraints,还是单个TableLock值。这就是为什么标志枚举值必须是: 1. 2 的幂和 2:互斥(速记值和组合值除外)。
| 归档时间: |
|
| 查看次数: |
1853 次 |
| 最近记录: |