0

そこで私は上級開発者の 1 人にトランザクション スコープ関連の問題を解決するための助けを求めました。彼は私のデスクに来て、SqlBulkCopy で別のオーバーロードを使用し、SqlBulkCopyOptions パラメーターに対して次のようなことを行いました。

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

現在は機能していますが、bitwise orここで a が何を意味するのかわかりません。ある程度理解しているつもりで実際に使ったことはありませんでしたが、この使い方には頭を悩ませました。ええ、私は先輩に説明を求めていませんでした..誰かが私がその声明が何をするかを理解するのを手伝ってくれることを望んでいました. ネット上のビット単位または例のほとんどは、いくつかの数値を使用していますが、これは取得できます (と思います)。

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 の累乗であることに注意してください。つまり、バイナリ (最後の列) では、それらのビットは完全に相互に排他的です。

これは、各値が設定されていることを確認できる方法でそれらを組み合わせることができることを意味KeepIdentityします。OR 演算子を使用しますが、ビットごとに行うため、必要な動作が得られます。TableLock0x010x04

バイナリで:

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

1 番目と 3 番目のビットがどのようになっているのかを観察します1

したがって、(KeepIdentity | TableLock == 5)。

このアプローチは、2 のべき乗ではない列挙値には機能KeepIdentity1ませCheckConstraintsん。2TableLock3

00000001 KeepIdentity
00000010 CheckConstraints
00000011 TableLock

のビットを分析しても、これがとの組み合わせなのか、単一の値00000011なのかを判断できないことに注意してください。1. 2 の累乗、および 2: 相互に排他的 (省略形と組み合わせ値は例外)。KeepIdentityCheckConstraintsTableLock

于 2015-04-01T01:14:36.297 に答える
1

enumanの基本型enumは常に整数型であるため、原則は数値の場合とまったく同じです。の宣言SqlBulkCopyOptions見ると、そのメンバーには 2 の累乗である基になる値があるため、このように組み合わせることができることがわかります。

于 2015-04-01T01:13:48.923 に答える