SqlBulkCopyOptions를 정의하는 비트 OR?

bitwise-or c# sqlbulkcopy

문제

그래서 내 수석 Dev에게 도움을 요청했습니다. Transaction scope와 관련된 문제를 찾아 내 책상에 와서 SqlBulkCopy에 다른 오버로드를 사용하고 SqlBulkCopyOptions 매개 변수에 대해 아래와 같이했습니다.

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

지금은 작동하지만, bitwise or 의미를 알지 못합니다. 나는 그것에 대해 약간의 이해를 가지고 있다고 생각했지만 실제로 사용하지는 않았지만이 사용법은 내 머리를 긁적이게했다. 네, 선배에게 내게 설명해달라고하지 않았습니다. 누군가가 저의 진술 내용을 이해하도록 도와 줄 수 있기를 바랍니다. 대부분의 비트 또는 예제는 그물에 몇 가지 숫자가 있습니다.

수락 된 답변

enum은 [Flags] 속성이 있고 서로 독립적 인 enum 값을 가진 경우 플래그로 사용할 수 있습니다.

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의 다음 제곱으로, 이진 열 (마지막 열)에서 비트가 완전히 상호 배타적임을 의미합니다.

즉, KeepIdentityTableLockKeepIdentity 경우 (예 : 0x010x04 각 값이 설정되어있는 것을 볼 수있는 방식으로 결합 할 수 있습니다. 우리는 OR 연산자를 사용하지만 비트 단위로 우리에게 원하는 동작을 제공합니다.

바이너리 :

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

첫번째와 세번째 비트가 현재 얼마나 관찰 1 .

따라서 ( KeepIdentity | TableLock == 5 ).

이 방법은 2의 거듭 제곱이 아닌 열거 형 값에 대해서는 작동하지 않습니다. 예를 들어, KeepIdentity 값이 1 이고 CheckConstraints 값이 2 이지만 TableLock 값이 3 인 경우, 이진수 값은 다음과 같습니다.

00000001 KeepIdentity
00000010 CheckConstraints
00000011 TableLock

00000011 의 비트를 분석하면 이것이 KeepIdentityCheckConstraints 또는 단일 TableLock 값의 조합인지 여부를 판별하는 것이 불가능하다는 것을 TableLock 있습니다. 이것이 플래그 열거 형 값이 다음과 같아야하는 이유입니다. 1. 2 및 2의 제곱 수 : 상호 배타적입니다 (약식 및 조합 값의 예외가 있음).


인기 답변

원리는 정확히와 동일 enum 의 기본 유형으로는 숫자와 같이 enum 항상 필수 유형입니다. SqlBulkCopyOptions선언 을 살펴보면이 멤버가 기본 값을 가짐을 알 수 있습니다.이 값은 2의 거듭 제곱이므로 이러한 방식으로 결합 될 수 있습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.