C# 做个用户权限管理,分五种权限。
发布网友
发布时间:2022-04-29 19:21
我来回答
共4个回答
热心网友
时间:2022-06-20 17:53
用位操作 按位与 &
二进制
权限1 是 00001
权限2 是 00010
权限3 是 00100
权限4 是 01000
权限5 是 10000
第二和第三种权限的话那就存2的二次方加2的三次方的和(4+8=12) 是 00110
如:
有第一种权限 select * from 权限表 where 权限值&1=1
有第一种和第二种权限 select * from 权限表 where 权限值&3=3 注:3=1+2
有第三种权限 select * from 权限表 where 权限值&4=4
你自己研究一下就可以搞定
我测试成功了追问我存在数年库的是int型啊,十进制形式的,不是二进制。有第二和第三种权限的话那就存数字12而已。
热心网友
时间:2022-06-20 17:53
你这个是典型的二进制数。每一位的1或0代表一个布尔值。
如你的题,第一种用2表示,就是10
第二种4表示,也就是100
一次类推。
如果在SQL中存的是Int,默认是十进制的表示形式。
我第一个想到的办法是创建一个自定义函数(如下)。这个是十进制数转换为二进制数的字符串形式,然后用LIKE去比较。
但是INT转字符串再比较肯定是比较损耗资源的。
据说SQL也有位运算。
&就是按位与。
……本机没装SQL,也没办法帮你测试……
附上int转二进制字符串:
Create FUNCTION DecToBin(@Dec Int)
RETURNS VARCHAR(16)
AS
begin
declare @BinStr as varchar(20)
declare @Mod2 as int
declare @Div2 as int
set @Div2 = @Dec / 2
set @Mod2 = @Dec % 2
set @BinStr=''
while @Div2<>0
begin
if @Mod2=0
set @BinStr = @BinStr + '0'
else
set @BinStr = @BinStr + '1'
set @Dec = @Dec / 2
set @Div2 = @Dec / 2
set @Mod2 = @Dec % 2
end
set @BinStr = @BinStr + '1'
return REVERSE(@BinStr + right('0000000000000000',16-len(@BinStr)))
end追问我是要取数据呀(取所有拥有权限二的用户存到dataset里就行了)。你把十进制转二进制是来干什么的?我数据库用户表里的权限那个字段存的是int型存的是十进制。你意思是把所有数据都取出来,再把权限这字段转成二进制的字符串,再按位与?得到符合的结果再存到dataset里吗?我的理解是这样!!
热心网友
时间:2022-06-20 17:53
SQL就实现很复杂,当然不排除有数学上的办法,但个人不记得了
所以给出程序中判断方法:
在C#通过数据库取出权限值后(假设赋值于a)
for(int i=5;i>=1;i--) //循环5-1判断是否有5-1权限
{
if(a-2^i>=0) //不为负则一定有i权限,数学方法,易证
{
有权限i; //是全部记录后在做判断(通用性强),或是到i==2时就选中(符合你的题意)
a-=2^i;
}
else
{
无权限i;
}
}
希望能帮到你
热心网友
时间:2022-06-20 17:54
我不太确定这种加法和与或的关系,不过你可以验证一下,把你的权限跟0x10与或一下,如果结果是2,证明含有第一个权限。