2014-04-04 180 views
3

我有一個枚舉來表示兩個狀態,我想創建組合。今天早上讀了一些閱讀後,我看到了flags屬性。我明白,如果每次增加2的冪次,那麼二進制值只設置一位,所以組合是可能的。與枚舉標誌掙扎

<Flags()> _ 
Public Enum TaskStatus 
    Incomplete = 1 
    Complete = 2 
End Enum 

1 = 0000001  
2 = 0000010 

所以1 + 2的組合將是0000011

我想然後構造一個數據庫paramater以指示其中指出,如果有的話,已被選定。什麼是最好的方法來做到這一點?我猜測我不能把二進制文件發送給我的sp,但我不確定。

我也不明白如果你在枚舉中有7個以上的值,這些標誌是如何工作的?

回答

2

爲什麼選擇7個值?一個標準整數是32位長。您可以使用64位的長整數。如果它是一個64位應用程序,則可以有128位長。如果你不關心數據庫內部的可讀性,那麼沒有理由不能將值存儲爲數據庫中的int或bigint。

此外,它會更容易保持的2權力,如果你表達自己的價值觀HEX:

Value1 = 0x1 
Value2 = 0x2 
Value3 = 0x4 
Value4 = 0x8 
Value5 = 0x10 
Value6 = 0x20 

要單獨插入每一個值到數據庫中,您將創建一個整型字段的每個標誌在數據庫中,然後當你插入這樣做:

flag1 = (int)flagEnumValue & (int) flagEnum.Value1 
flag2 = (int)flagEnumValue & (int) flagEnum.Value2 

這是一個按位與,你可以閱讀有關here

+1

當然,這是有道理的。存儲在數據庫中的細節可能是1或2.我想構造一個過濾器,以便我可以查詢1或2。你能建議嗎? – DavidB

+0

啊,在這種情況下,你可能會想爲每個標誌值創建一個單獨的字段並使用位掩碼插入。我會編輯我的答案,告訴你 – pquest

+0

謝謝,但數據庫不存儲組合,每行將有1個狀態。這是爲了過濾。我希望每個狀態在UI上都有一個tickbox,勾選它意味着在數據庫中搜索該狀態。 – DavidB