我有一个枚举如下:
[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参数?
谢谢,
答案 0 :(得分:3)
一些事情..
1)你需要使用OR而不是AND:
AggregationLevel thisLevel = AggregrationLevel.Department | AggregationLevel.Division;
2)您可以使用此序列,因此您不必记住十进制的2的幂:
0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100 ...
3)最后,varbinary
不是你想要的。查看integer
或bigint
。枚举存储为int
或long
s,您只能使用int
或long
中的位数。如果你想存储在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)
您不需要将其存储为“字节数组”,组合值可以轻松地适合单个整数。