我目前正在考虑一种在数据库中存储复选框值(真/假)的方法,而不必为每个复选框使用布尔列。有没有一种方法可以将它们存储在包含六个复选框的信息的字节中?
例如:
*复选框1至6全部未选中将为00000000
*复选框1至6全部选中为00111111
*复选框1已选中,其余未选中将是00000001
*复选框3和4处于选中状态,未选中则为00001100
*等。
在编辑之前:“最后将有一个字节列,并且每一行的复选框被选中/未选中都具有不同的组合。”
修改后:哦,我知道我不清楚。我并不是说复选框的每种可能组合都存储在表中的不同行中,例如查找表。更像是,整个表包含来自公式编制器中用户条目的信息,并且用户选中的复选框只是表单的一个元素(db行的一列)。因此,表单(行)的每个用户条目在复选框列中都可以包含一个不同的字节。但是,如果更多的用户选择了相同的复选框,那么他们行中的字节当然会看起来相同。
这可以代替一堆布尔列(每个复选框一个)是否有意义?
是否有更好的方法来处理数据库中的复选框值?
有没有一种方法可以在C#中手动设置字节的每个位?我似乎找不到有关如何执行此操作的解释。
答案 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;不要过于复杂,只需将值存储为布尔值即可。过早的优化不是一个好主意。