Как конвертировать Enum в массив байтов? - PullRequest
1 голос
/ 07 сентября 2011

У меня есть перечисление как показано ниже:

[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 (массив байтов).

У меня есть экземпляр enum, который должен бытьпередано ему:

AggregationLevel thisLevel = AggregationLevel.Department & AggregationLevel.Division;

Затем значение должно быть передано этой хранимой процедуре:

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

параметр =?

Как преобразовать мой 'thisLevel'перечислить массив байтов, чтобы его можно было присвоить этому параметру sql?

Спасибо,

Ответы [ 3 ]

3 голосов
/ 07 сентября 2011

Несколько вещей ..

1) Вам нужно использовать ИЛИ, а не И:

AggregationLevel thisLevel = AggregrationLevel.Department | AggregationLevel.Division;

2) Вы можете использовать эту последовательность, чтобы вам не приходилось запоминать силыиз 2 в десятичном виде:

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

3) Наконец, varbinary не то, что вы хотите.Посмотрите на integer или bigint.Перечисления хранятся как int с или long с, и вы ограничены количеством битов в int или long.Если вы хотите сохранить в varbinary, вам нужно будет сериализовать значение в строку байтов, это будет зависеть от того, хотите ли вы использовать big-endian, сколько байтов следует использовать для хранения - может быть, дажепеременная и т. д. Требуется дополнительная информация.

Два варианта для # 3:

A.Если под вашим контролем находится только вы / код, не используйте varbinary, используйте int или bigint (в зависимости от количества требуемых битов).Еще лучше (потенциально), вместо этого используйте битовые поля, если вы собираетесь запросить их

B.Если это не так, администратор базы данных или провайдер приложения смогут указать, как они хотят, чтобы их varbinary заполнял

Надеюсь, что это поможет.

1 голос
/ 07 сентября 2011

Используйте int в вашей БД и сохраните как int значение:

AggregationLevel thisLevel = AggregationLevel.Department | AggregationLevel.Division;

int val = (int)thisLevel;

AggregationLevel lvlUpd = (AggregationLevel)val;
0 голосов
/ 07 сентября 2011

Вам не нужно хранить его как «массив байтов», объединенное значение удобно помещается в одно целое число.

...