Bitweises ODER zum Definieren von SqlBulkCopyOptions?

bitwise-or c# sqlbulkcopy

Frage

Also bat ich einen meiner Senior Dev um Hilfe, um das mit dem Transaktionsumfang zusammenhängende Problem herauszufinden und er kam zu meinem Schreibtisch und benutzte eine andere Überladung auf SqlBulkCopy und für SqlBulkCopyOptions Parameter tat er etwas wie unten:

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

Es funktioniert jetzt, aber ich verstehe nicht was ein bitwise or bedeutet hier. Ich dachte, ich hätte etwas davon verstanden, habe es nie wirklich benutzt, aber diese Verwendung hat mich dazu gebracht, mich am Kopf zu kratzen. Yep, ich habe meinen Senior nicht gebeten, es mir zu erklären. Ich hatte gehofft, dass jemand mir helfen könnte zu verstehen, was die Aussage macht. Die meisten der bitweisen oder Beispiele im Netz sind mit einigen Zahlen, die ich bekomme (denke ich), aber das?

Akzeptierte Antwort

Eine Enumeration kann als Flag verwendet werden, wenn sie das Attribut [Flags] besitzt und Enum-Werte aufweist, die unabhängig voneinander sind:

Die Definition von SqlBulkCopyOptions ist hier: https://github.com/Microsoft/referencesource/blob/master/System.Data/System/Data/SqlClient/SqlBulkCopyOptions.cs

Ignoriere die Verwendung der Bitshift-Syntax. Die tatsächlichen Werte sind:

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

Beachten Sie, dass jeder Wert die nächste Potenz von 2 ist, was bedeutet, dass sich die Bits in der Binärdatei (letzte Spalte) gegenseitig ausschließen.

Das heißt, Sie können sie so kombinieren, dass Sie sehen, dass jeder Wert gesetzt ist, zum Beispiel, wenn Sie KeepIdentity und TableLock , das ist 0x01 mit 0x04 . Wir verwenden den ODER-Operator, aber auf einer Bit-Basis, was uns das gewünschte Verhalten gibt:

In binär:

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

Beobachte, wie das erste und das dritte Bit jetzt 1 .

Also, ( KeepIdentity | TableLock == 5 ).

Dieser Ansatz funktioniert nicht für Aufzählungswerte, die keine Zweierpotenzen sind, z. B. wenn KeepIdentity den Wert 1 und CheckConstraints den Wert 2 aber TableLock den Wert 3 und dann binär:

00000001 KeepIdentity
00000010 CheckConstraints
00000011 TableLock

Beachten Sie, dass durch die Analyse der Bits von 00000011 nicht festgestellt werden kann, ob dies die Kombination aus KeepIdentity und CheckConstraints oder ein einzelner TableLock Wert ist. Aus diesem Grund müssen die Flags enum-Werte wie folgt sein: 1. Power von 2 und 2: sich gegenseitig ausschließend (mit Ausnahmen für Kurz- und Kombinationswerte).


Beliebte Antwort

Das Prinzip ist bei einem enum genau so wie bei Zahlen, da der zugrunde liegende Typ eines enum immer ein ganzzahliger Typ ist. Wenn Sie sich die Deklaration von SqlBulkCopyOptions , werden Sie sehen, dass ihre Member darunter liegende Potenzen haben, so dass sie auf diese Weise kombiniert werden können.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow