1

私は以下のような列挙型を持っています:

[Flags]
public enum AggregationLevel
{
    /// <summary>
    /// 00000001
    /// </summary>
    Department = 1,

    /// <summary>
    /// 00000010
    /// </summary>
    Gbu = 2,

    /// <summary>
    /// 00000100
    /// </summary>
    Division = 4,

    /// <summary>
    /// 00001000
    /// </summary>
    Region = 8,

    /// <summary>
    /// 00010000
    /// </summary>
    Market = 16,

    /// <summary>
    /// 00100000
    /// </summary>
    Cluster = 32,

    /// <summary>
    /// 01000000
    /// </summary>
    Store = 64
}

次に、varbinary(バイトの配列)を必要とするストアドプロシージャパラメータがあります。

私はそれに渡されるべき列挙型インスタンスを持っています:

AggregationLevel thisLevel = AggregationLevel.Department & AggregationLevel.Division;

次に、値を次のストアドプロシージャに渡す必要があります。

var parameter = new SqlParameter("@pBitMask", SqlDbType.VarBinary)

パラメータ=?

'thisLevel'列挙型をバイトの配列に変換して、このsqlパラメーターに割り当てることができるようにするにはどうすればよいですか?

ありがとう、

4

3 に答える 3

3

いくつかのこと..

1)ANDではなくORを使用する必要があります。

AggregationLevel thisLevel = AggregrationLevel.Department | AggregationLevel.Division;

2)このシーケンスを使用できるため、10進数で2の累乗を覚えておく必要はありません。

0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100 ...

3)最後に、varbinaryあなたが望むものではありません。integerまたはを見てくださいbigintint列挙型はsまたはsとして格納され、またはlongのビット数に制限されます。に格納する場合は、値をバイトの文字列にシリアル化する必要があります。ビッグエンディアンが必要かどうか、格納に使用するバイト数によって異なります。可変の場合もあります。 。より多くの情報が必要です。intlongvarbinary

#3の2つのオプション:

A.自分の管理下にあるのがあなた/コードだけの場合は、varbinaryを使用せず、intまたはbigintを使用してください(必要なビット数によって異なります)。さらに(潜在的に)、ビットフィールドをクエリする場合は、代わりにビットフィールドを使用することをお勧めします。

B.そうでない場合、DBAまたはアプリプロバイダーは、varbinaryをどのように設定するかを指定できます。

お役に立てば幸いです。

于 2011-09-07T09:26:25.320 に答える
1

intDBで使用し、int値として保存します。

AggregationLevel thisLevel = AggregationLevel.Department | AggregationLevel.Division;

int val = (int)thisLevel;

AggregationLevel lvlUpd = (AggregationLevel)val;
于 2011-09-07T09:30:18.143 に答える
0

「バイトの配列」として格納する必要はありません。結合された値は、単一の整数に快適に収まります。

于 2011-09-07T09:27:24.967 に答える