如何将枚举转换为字节数组?

时间:2011-09-07 09:22:02

标签: c# stored-procedures enums varbinary

我有一个枚举如下:

[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参数?

谢谢,

3 个答案:

答案 0 :(得分:3)

一些事情..

1)你需要使用OR而不是AND:

AggregationLevel thisLevel = AggregrationLevel.Department | AggregationLevel.Division;

2)您可以使用此序列,因此您不必记住十进制的2的幂:

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

3)最后,varbinary不是你想要的。查看integerbigint。枚举存储为intlong s,您只能使用intlong中的位数。如果你想存储在varbinary中,你需要将一个值序列化为一串字节,这将取决于你是否需要big-endian,应该使用多少字节来存储 - 也许它甚至可变,等等。需要更多信息。

#3的两个选项:

一个。如果它只是您/您控制下的代码,请不要使用varbinary,使用int或bigint(取决于所需的位数)。更好(可能),使用位字段,如果你要查询它们

B中。如果不是,DBA或应用程序提供商将能够指定他们希望如何填充varbinary

希望有所帮助。

答案 1 :(得分:1)

在您的数据库中使用int并存储为int值:

AggregationLevel thisLevel = AggregationLevel.Department | AggregationLevel.Division;

int val = (int)thisLevel;

AggregationLevel lvlUpd = (AggregationLevel)val;

答案 2 :(得分:0)

您不需要将其存储为“字节数组”,组合值可以轻松地适合单个整数。