我需要创建一个大的枚举,它将用作位标志。使用标准加倍,即1,2,4,以确保任何组合的唯一性是好的,除非我用完数字,如果我使用int(20亿上限)。我也不能使用大的int,因为Sql server对按位操作有限制,并且会截断为10个字符。
我想知道的是如何在那里输出负数,并且仍然确保所有组合保持唯一。 (例如,ADO.NET库中使用的一些枚举值似乎有负整数)。
答案 0 :(得分:4)
您可以根据ulong
:
[Flags]
enum Foo : ulong
{
A = 1 ,
B = 2 ,
C = 4 ,
. . .
}
将它作为两个整数存储在数据库中,如下所示:
Save( Foo value )
{
ulong bitfield = (ulong) value ;
int hiNibble = (int)( (bitfield>>32) & 0x00000000FFFFFFFF ) ;
int loNibble = (int)( (bitfield>>0) & 0x00000000FFFFFFFF ) ;
// store the hi and lo nibbles as two integer columns in your database
}
在您的数据库中,将表格创建为
create table dbo.some_table
(
hiNibble int ,
loNibble int ,
bitField as convert(bigint, convert(varbinary,hiNibble) + convert(varbinary,loNibble) )
)
现在你有两个32位整数,你可以在SQL中进行旋转,你有一个64位整数,你可以传回你的C#代码并重新水化它代表的基于ulong
的枚举。