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)您需要使用 OR 而不是 AND:

AggregationLevel thisLevel = AggregrationLevel.Department | AggregationLevel.Division;

2) 你可以使用这个序列,这样你就不必记住十进制 2 的幂:

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

3)最后,varbinary不是你想要的。看integerbigint。枚举存储为ints 或s,并且您受限于 an或 along中的位数。如果您确实想存储在 a中,则需要将一个值序列化为一串字节,这将取决于您是否需要大端序,应该使用多少字节进行存储 - 也许它甚至是可变的等. 需要更多信息。intlongvarbinary

#3 的两个选项:

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

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

希望有帮助。

于 2011-09-07T09:26:25.320 回答
1

在您的数据库中使用int并存储为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 回答