有没有办法使用一堆位(或一个字节)而不是一堆布尔值?

时间:2018-11-12 20:55:07

标签: c# database checkbox byte bit

我目前正在考虑一种在数据库中存储复选框值(真/假)的方法,而不必为每个复选框使用布尔列。有没有一种方法可以将它们存储在包含六个复选框的信息的字节中?

例如:
    *复选框1至6全部未选中将为00000000
    *复选框1至6全部选中为00111111
    *复选框1已选中,其余未选中将是00000001
    *复选框3和4处于选中状态,未选中则为00001100
    *等。

在编辑之前:“最后将有一个字节列,并且每一行的复选框被选中/未选中都具有不同的组合。”

修改后:哦,我知道我不清楚。我并不是说复选框的每种可能组合都存储在表中的不同行中,例如查找表。更像是,整个表包含来自公式编制器中用户条目的信息,并且用户选中的复选框只是表单的一个元素(db行的一列)。因此,表单(行)的每个用户条目在复选框列中都可以包含一个不同的字节。但是,如果更多的用户选择了相同的复选框,那么他们行中的字节当然会看起来相同。

这可以代替一堆布尔列(每个复选框一个)是否有意义?

是否有更好的方法来处理数据库中的复选框值?

有没有一种方法可以在C#中手动设置字节的每个位?我似乎找不到有关如何执行此操作的解释。

2 个答案:

答案 0 :(得分:1)

您必须为字节定义枚举大小,并且必须具有attrbute FlagAttribute。

这是它的示例代码:

[Flags]
public enum BitFields : byte
{
    CheckBox_01 =      0,
    CheckBox_02 = 1 << 0,
    CheckBox_02 = 1 << 1,
    CheckBox_02 = 1 << 2,
    CheckBox_02 = 1 << 3,
    CheckBox_02 = 1 << 4,
    CheckBox_02 = 1 << 5
}

在C ++之后,我们就可以了:

BitFields bits = BitFields.None;

bits |= BitFields.CheckBox_01| BitFields.CheckBox_01;
bits &= ~BitFields.CheckBox_04;

编写此一字节大小的枚举值时,将获得所需的结果。

奖励

答案 1 :(得分:0)

您可以存储一个字节,并将不同的值映射到选中的复选框。 IE:00000000未选中任何按钮,00111111所有6个按钮均已选中。但是,这将花费很多额外的工作,并且没有遵循良好的设计原则。

如果持久按钮状态很重要,那么我建议您制作一个名为buttonstate的表,并将每个按钮的状态存储为一行。这样可以降低复杂性,并允许您的应用程序更好地扩展,使代码更易于管理,并从其他方面获得很多好处。

TLDR;不要过于复杂,只需将值存储为布尔值即可。过早的优化不是一个好主意。