2013-11-12 4 views
0

Мне нужно создать большое перечисление, которое будет использоваться как битовые флаги. Использование стандартного удвоения, то есть 1, 2, 4, чтобы обеспечить уникальность любой комбинации, отлично, за исключением того, что у меня заканчиваются числа, если я использую int (2 миллиарда верхних пределов). Я также не могу использовать большой int, поскольку сервер Sql имеет ограничение на побитовые операции и усекает до 10 символов.Перечисления с положительными и отрицательными значениями

Что я хотел знать, так это то, как отбросить здесь отрицательные числа и по-прежнему гарантировать, что все комбинации остаются уникальными. (например, некоторые значения перечисления, используемые в библиотеке ADO.NET, похоже, имеют отрицательные целые числа).

+1

Я не думаю, что возможно получить функциональность флагов с отрицательными значениями. – MarcinJuraszek

+0

Вы можете использовать 2 столбца. 1 для бита бит, а другой - бит для указания знака. – NoChance

+0

Сколько бит вам нужно? Нужно ли обрабатывать биты в TSQL или все действия будут выполняться в коде приложения, например. C#? Существует некоторое обсуждение добавления UDF для обработки больших двоичных значений [здесь] (http://www.sql-questions.com/microsoft/SQL-Server-Programming/29207417/bitwise-operation-on-binary-datatypes.aspx) , – HABO

ответ

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-битных целых числа, le в SQL, и у вас есть 64-битное целое число, которое вы можете передать обратно на свой код C# и регидратировать в качестве перечисляемого на нем перечисления ulong.

Смежные вопросы