具有正值和负值的枚举

时间:2013-11-12 01:45:30

标签: c# sql-server tsql enums

我需要创建一个大的枚举,它将用作位标志。使用标准加倍,即1,2,4,以确保任何组合的唯一性是好的,除非我用完数字,如果我使用int(20亿上限)。我也不能使用大的int,因为Sql server对按位操作有限制,并且会截断为10个字符。

我想知道的是如何在那里输出负数,并且仍然确保所有组合保持唯一。 (例如,ADO.NET库中使用的一些枚举值似乎有负整数)。

1 个答案:

答案 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的枚举。