【问题标题】:Enums with positive and negative values具有正值和负值的枚举
【发布时间】:2013-11-24 00:37:30
【问题描述】:

我需要创建一个大型枚举,用作位标志。使用标准加倍,即 1、2、4 来确保任何组合的唯一性都可以,除非我使用 int(20 亿上限)时会用完数字。我也不能使用大整数,因为 Sql server 对按位运算有限制,会截断为 10 个字符。

我想知道的是如何将负数也放入其中,同时仍确保所有组合保持唯一。 (例如 ADO.NET 库中使用的一些枚举值似乎有负整数)。

【问题讨论】:

  • 我认为不可能获得带有负值的位标志功能。
  • 您可以使用 2 列。 1为位标志,另一个为位表示符号。
  • 您需要多少位?您是否需要在 TSQL 中处理这些位,或者所有的摆弄都在应用程序代码中完成,例如C#?有一些关于添加 UDF 来处理大二进制值的讨论here

标签: c# sql-server tsql enums


【解决方案1】:

您可以基于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 的枚举进行再水化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多