【问题标题】:How to store permission binary sets如何存储权限二进制集
【发布时间】:2015-02-25 20:14:10
【问题描述】:

我正在尝试找到一种将权限信息存储到 SQL Server 2012 数据库中的方法。 我的权限是这样设置的:

[Flags]
public enum PermissionsB
{
    Aucun = 00000000,
    read = 00000001,
    write= 00000010,
    ssss = 00000100,
    tttt = 00001000,
    rrrr = 00010000,
}

而且我找不到一种方法来存储到数据库中,比如 00000011,它允许人们在我的程序中读取/写入一些东西。我确实有一个 int 列可以存储它,但还不知道如何使用它。

【问题讨论】:

  • 那么这个问题只是关于在数据库中存储一个 int 值吗?或者您不知道如何将您的枚举值转换为 int?您能更具体地说明您的问题吗?
  • 实际上你的二进制标志不是二进制的,你应该使用 0x 十进制数的前缀将其保存为二进制,你可以做一个 OR 操作将权限加在一起成一个二进制数和将其存储在您的数据库中
  • @CME64 0x 是十六进制,而不是二进制。
  • 您是否将权限用作标志,即可以组合这些值以允许读/写?如果是这样,并且根据您在 SQL 端的预期用途,您可能需要考虑单独存储这些值,以便您可以获得(更多)索引的好处。如果您通过从整数列中屏蔽它们来访问 WHERE 子句中的各个位,则评估将继续 RBAR
  • 不知道如何将枚举值转换为 int 到数据库中。是的,权限被用作标志。

标签: c# database enums sql-server-2012 user-permissions


【解决方案1】:

您需要在枚举上使用按位或|

PermissionsB permission = PermissionsB.read | PermissionsB.write;

Here for more information on enums in C#

Here for very detailed information on using bitwise enums

【讨论】:

  • 不错的链接谢谢。如何将该权限存储到数据库中?
  • 只需将我的示例 permission 转换为 int 并存储它。
【解决方案2】:

你应该这样做:

[Flags]
public enum PermissionsB
{
    Aucun = 0,
    read = 1,
    write= 2,
    ssss = 4,
    tttt = 8,
    rrrr = 16,
}

或使用 C# 7 数字文字语法,这可能会提高可读性:

[Flags]
public enum PermissionsB
{
    Aucun= 0b00000,
    read = 0b00001,
    write= 0b00010,
    ssss = 0b00100,
    tttt = 0b01000,
    rrrr = 0b10000,
}

那么正如 Jeffrey 所说,你应该使用按位运算:

PermissionsB permission = PermissionsB.read | PermissionsB.write;

你将存储的值是一个整数,你可以直接转换它:

int intPermission = (int) permission;

要恢复已保存的权限,您只需这样做:

PermissionsB retrievedPermission = (PermissionsB) retrievedInteger;

要测试单个权限,只需使用按位运算:

bool canWrite = (retrievedPermission & PermissionsB.write) == PermissionsB.write;

实体框架(如果我记得清楚的话,我认为 EF > 4.5)可以透明地管理 Enum 类型,因此您不需要在数据库中转换 Integer,如果您的后端数据库,我强烈建议使用 EF支持。

【讨论】:

  • 你忘记了[Flags]-属性
  • 好的,所以我需要基本上添加这样的权限(用于读+写权限): PermissionsB permission = PermissionsB.read |权限B.写;这将给我 3,然后我将该 int 存储到数据库中。如何检索单独的权限以测试条件以显示每个用户的权限?
  • 感谢您的宝贵时间,我确实在我的应用程序中使用了 EF。为我节省了大约 1000 多个小时。祝你有美好的一天!
猜你喜欢
  • 2013-08-02
  • 2012-05-17
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多