2023年6月21日发(作者:)
SQL位运算
在SQL Server ,采⽤1,2,4,等⽤数字标识的状态字段可以进⾏累加,对存在的⼏种状态进⾏组合,从⽽可形成各种组合状态例如:⼀条记录该字段原来的数字是,2,如我们想加上4,则可以⽤update t_User set iFlag = iFlag | 4 where UserID = 1(iFlag 为该字段名)例2:在加上4之后我们想去掉4怎么办呢,可以这样实现update t_User set iFlag = iFlag ^4 where UserID = 1这样就⼜把4从该记录中去掉了.如果我们想选择所有为2的记录该怎么做呢,可以这样实现select * from t_User where iFlag &2 = 2SQL中的位运算不但可以取出各种值,⽽且我们可以对他对数据进⾏排序举例如下,新闻列表中的⼀个字段标识为1:置顶2:不置顶4:推荐8:不推荐该字段的值可以为这4种状态的组合,如果我们根据⼀定条件想把所有置顶的放在前⾯该如何做呢select * from t_News order by iFlag & 1 desc这样我们就把所有置顶的贴⼦排在前⾯,当然这⾥可以加上⼀定的Where 条件,在Where ⾥也可可以加⼀定的位运算,关于位运算可以查阅相应的SQL 帮助下⾯来讲⼀讲C#中的枚举位运算这⾥我们定义⼀个枚举 [Flags] enum UserFlag { a = 1, b = 2, c = 4, d = 8, e = 16, f = 32 }在代码⾥加上如下处理 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) {
这是第⼀种写法: string strSQL = "select * from v_User where iFlag & @iFlag = @iFlag"; 这是第⼆种写法: string strSQL = "select * from v_User where @iFlag | iFlag = iFlag //SqlParameter parm = new SqlParameter("@iFlag",,4); // = UserFlag.a | UserFlag.b ; SqlConnection con = new SqlConnection("server=.;database=Sinvan_TexDB;User Id=sa;pwd=123;"); SqlCommand comm = new SqlCommand(strSQL, con); ("@iFlag", , 4).Value = UserFlag.a | UserFlag.b; SqlDataAdapter adp = new SqlDataAdapter(comm); DataTable dTable = new DataTable(); (dTable); UserFlag userFlag = (UserFlag)(typeof(UserFlag), [0][11].ToString());
} }进⾏处理之后userFlag就是数据库中存在的各种组合我们同样可对其进⾏⼀定的位运算处理如我们想加上 UserFlag.c 可进⾏如下操作userFlag = userFlag | Userflag.c如想去掉UserFlag.c 可进⾏如下操作userFlag = userFlag ^ UserFlag.c如我们要判断是该标识中是否存在c可进⾏如下操作(userFlag & UserFlag.c) == UserFlag.c是不是与SQL Server 中的操作类似,位运算不管什么语⾔都是通⽤的,呵呵可惜Access 不⽀持位运算
select 2|8 --10
select 2|8|1 --11select 10&8 --8,包含,10=8+2
select 10&2 --2,包含,10=2+8
select 10&4 --0,不包含
select 19&16 --16,包含,19=16+2+1
select 19&8 --0,包含,19=16+2+1select * from SqlBitOperation where FBitTags&4=4
在权限中的应⽤1、两张表(1)、操作与权限标志表if exists (select * from sysobjects where id = OBJECT_ID('[RightTags]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE [RightTags]CREATE TABLE [RightTags] (
[Pkid] [int] IDENTITY (1, 1) NOT NULL,
[RightsName] [nvarchar] (50) NOT NULL,
[RightsTag] [int] NOT NULL DEFAULT (0))ALTER TABLE [RightTags] WITH NOCHECK ADD CONSTRAINT [PK_RightTags] PRIMARY KEY NONCLUSTERED ( [Pkid] )
SET IDENTITY_INSERT [RightTags] ON
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 1,'吃饭',1)
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 2,'拉屎',2)
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 3,'打炮',4)
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 4,'泡妞',8)
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 5,'⽣⼦',16)
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 6,'包⼆奶',32)
SET IDENTITY_INSERT [RightTags] OFF(2)、⽤户与权限表if exists (select * from sysobjects where id = OBJECT_ID('[RightUsers]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE [RightUsers]CREATE TABLE [RightUsers] (
[Pkid] [int] IDENTITY (1, 1) NOT NULL,
[FUser] [nvarchar] (50) NOT NULL,
[UserRights] [int] NOT NULL DEFAULT (0))ALTER TABLE [RightUsers] WITH NOCHECK ADD CONSTRAINT [PK_RightUsers] PRIMARY KEY NONCLUSTERED ( [Pkid])
SET IDENTITY_INSERT [RightUsers] ON
INSERT [RightUsers] ([Pkid],[FUser],[UserRights]) VALUES ( 1,'张三',7)
INSERT [RightUsers] ([Pkid],[FUser],[UserRights]) VALUES ( 2,'李四',9)
INSERT [RightUsers] ([Pkid],[FUser],[UserRights]) VALUES ( 3,'王⽼板',63)
INSERT [RightUsers] ([Pkid],[FUser],[UserRights]) VALUES ( 4,'朱⿇⼦',0)
SET IDENTITY_INSERT [RightUsers] OFF
2、访问判断是否有权限--1.查询权限
declare @iRights as int
select @iRights=(select top 1 RightsTag from RightTags where RightsName='打炮')
--print @iRights
select * from RightUsers where UserRights&@iRights=@iRights --所有可以打炮的⼈
select * from RightUsers where FUser='李四' and UserRights&@iRights=@iRights --此⼈是否可以打炮(有⽆记录集)
select * from RightUsers where FUser='王⽼板' and UserRights&@iRights=@iRights --此⼈是否可以打炮(有⽆记录集)go
3、设置权限--2.设置权限
declare @yourRights int
select @yourRights=(select sum(RightsTag) from RightTags where RightsName in('吃饭','拉屎','打炮'))
--print @yourRightsupdate RightUsers set UserRights=@yourRights where FUser='张三'
go
4、查看此⼈的所有权限--3.查看此⼈的所有权限
declare @yourRights as int
select @yourRights=(select UserRights from RightUsers where FUser='李四')
print @yourRightsselect * from RightTags where @yourRights&RightsTag=RightsTag
go
5、检测权限表权限值是否为2的整数次⽅(操作权限标志的有效性:唯⼀+2的整数次⽅)select power(2,6) --64select power(2.000,5.500) --45.255select log(64.000)/log(2.000)--6.0------------------------------declare @setNewOperateRightTags int --添加⼀个新操作权限set @setNewOperateRightTags=64 --64是2的整数次⽅--set @setNewOperateRightTags=63 --63不是2的整数次⽅declare floatset @number=log(@setNewOperateRightTags)/log(2.000)--print
if(ceiling(@number)=floor(@number))--取最⼤整数=取最⼩整数begin print cast(@setNewOperateRightTags as varchar(16)) + '是2的整数次⽅,可以⽤作权限标志值'endelsebegin print cast(@setNewOperateRightTags as varchar(16)) + '不是2的整数次⽅,不能⽤作权限标志值'end
2023年6月21日发(作者:)
SQL位运算
在SQL Server ,采⽤1,2,4,等⽤数字标识的状态字段可以进⾏累加,对存在的⼏种状态进⾏组合,从⽽可形成各种组合状态例如:⼀条记录该字段原来的数字是,2,如我们想加上4,则可以⽤update t_User set iFlag = iFlag | 4 where UserID = 1(iFlag 为该字段名)例2:在加上4之后我们想去掉4怎么办呢,可以这样实现update t_User set iFlag = iFlag ^4 where UserID = 1这样就⼜把4从该记录中去掉了.如果我们想选择所有为2的记录该怎么做呢,可以这样实现select * from t_User where iFlag &2 = 2SQL中的位运算不但可以取出各种值,⽽且我们可以对他对数据进⾏排序举例如下,新闻列表中的⼀个字段标识为1:置顶2:不置顶4:推荐8:不推荐该字段的值可以为这4种状态的组合,如果我们根据⼀定条件想把所有置顶的放在前⾯该如何做呢select * from t_News order by iFlag & 1 desc这样我们就把所有置顶的贴⼦排在前⾯,当然这⾥可以加上⼀定的Where 条件,在Where ⾥也可可以加⼀定的位运算,关于位运算可以查阅相应的SQL 帮助下⾯来讲⼀讲C#中的枚举位运算这⾥我们定义⼀个枚举 [Flags] enum UserFlag { a = 1, b = 2, c = 4, d = 8, e = 16, f = 32 }在代码⾥加上如下处理 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) {
这是第⼀种写法: string strSQL = "select * from v_User where iFlag & @iFlag = @iFlag"; 这是第⼆种写法: string strSQL = "select * from v_User where @iFlag | iFlag = iFlag //SqlParameter parm = new SqlParameter("@iFlag",,4); // = UserFlag.a | UserFlag.b ; SqlConnection con = new SqlConnection("server=.;database=Sinvan_TexDB;User Id=sa;pwd=123;"); SqlCommand comm = new SqlCommand(strSQL, con); ("@iFlag", , 4).Value = UserFlag.a | UserFlag.b; SqlDataAdapter adp = new SqlDataAdapter(comm); DataTable dTable = new DataTable(); (dTable); UserFlag userFlag = (UserFlag)(typeof(UserFlag), [0][11].ToString());
} }进⾏处理之后userFlag就是数据库中存在的各种组合我们同样可对其进⾏⼀定的位运算处理如我们想加上 UserFlag.c 可进⾏如下操作userFlag = userFlag | Userflag.c如想去掉UserFlag.c 可进⾏如下操作userFlag = userFlag ^ UserFlag.c如我们要判断是该标识中是否存在c可进⾏如下操作(userFlag & UserFlag.c) == UserFlag.c是不是与SQL Server 中的操作类似,位运算不管什么语⾔都是通⽤的,呵呵可惜Access 不⽀持位运算
select 2|8 --10
select 2|8|1 --11select 10&8 --8,包含,10=8+2
select 10&2 --2,包含,10=2+8
select 10&4 --0,不包含
select 19&16 --16,包含,19=16+2+1
select 19&8 --0,包含,19=16+2+1select * from SqlBitOperation where FBitTags&4=4
在权限中的应⽤1、两张表(1)、操作与权限标志表if exists (select * from sysobjects where id = OBJECT_ID('[RightTags]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE [RightTags]CREATE TABLE [RightTags] (
[Pkid] [int] IDENTITY (1, 1) NOT NULL,
[RightsName] [nvarchar] (50) NOT NULL,
[RightsTag] [int] NOT NULL DEFAULT (0))ALTER TABLE [RightTags] WITH NOCHECK ADD CONSTRAINT [PK_RightTags] PRIMARY KEY NONCLUSTERED ( [Pkid] )
SET IDENTITY_INSERT [RightTags] ON
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 1,'吃饭',1)
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 2,'拉屎',2)
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 3,'打炮',4)
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 4,'泡妞',8)
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 5,'⽣⼦',16)
INSERT [RightTags] ([Pkid],[RightsName],[RightsTag]) VALUES ( 6,'包⼆奶',32)
SET IDENTITY_INSERT [RightTags] OFF(2)、⽤户与权限表if exists (select * from sysobjects where id = OBJECT_ID('[RightUsers]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE [RightUsers]CREATE TABLE [RightUsers] (
[Pkid] [int] IDENTITY (1, 1) NOT NULL,
[FUser] [nvarchar] (50) NOT NULL,
[UserRights] [int] NOT NULL DEFAULT (0))ALTER TABLE [RightUsers] WITH NOCHECK ADD CONSTRAINT [PK_RightUsers] PRIMARY KEY NONCLUSTERED ( [Pkid])
SET IDENTITY_INSERT [RightUsers] ON
INSERT [RightUsers] ([Pkid],[FUser],[UserRights]) VALUES ( 1,'张三',7)
INSERT [RightUsers] ([Pkid],[FUser],[UserRights]) VALUES ( 2,'李四',9)
INSERT [RightUsers] ([Pkid],[FUser],[UserRights]) VALUES ( 3,'王⽼板',63)
INSERT [RightUsers] ([Pkid],[FUser],[UserRights]) VALUES ( 4,'朱⿇⼦',0)
SET IDENTITY_INSERT [RightUsers] OFF
2、访问判断是否有权限--1.查询权限
declare @iRights as int
select @iRights=(select top 1 RightsTag from RightTags where RightsName='打炮')
--print @iRights
select * from RightUsers where UserRights&@iRights=@iRights --所有可以打炮的⼈
select * from RightUsers where FUser='李四' and UserRights&@iRights=@iRights --此⼈是否可以打炮(有⽆记录集)
select * from RightUsers where FUser='王⽼板' and UserRights&@iRights=@iRights --此⼈是否可以打炮(有⽆记录集)go
3、设置权限--2.设置权限
declare @yourRights int
select @yourRights=(select sum(RightsTag) from RightTags where RightsName in('吃饭','拉屎','打炮'))
--print @yourRightsupdate RightUsers set UserRights=@yourRights where FUser='张三'
go
4、查看此⼈的所有权限--3.查看此⼈的所有权限
declare @yourRights as int
select @yourRights=(select UserRights from RightUsers where FUser='李四')
print @yourRightsselect * from RightTags where @yourRights&RightsTag=RightsTag
go
5、检测权限表权限值是否为2的整数次⽅(操作权限标志的有效性:唯⼀+2的整数次⽅)select power(2,6) --64select power(2.000,5.500) --45.255select log(64.000)/log(2.000)--6.0------------------------------declare @setNewOperateRightTags int --添加⼀个新操作权限set @setNewOperateRightTags=64 --64是2的整数次⽅--set @setNewOperateRightTags=63 --63不是2的整数次⽅declare floatset @number=log(@setNewOperateRightTags)/log(2.000)--print
if(ceiling(@number)=floor(@number))--取最⼤整数=取最⼩整数begin print cast(@setNewOperateRightTags as varchar(16)) + '是2的整数次⽅,可以⽤作权限标志值'endelsebegin print cast(@setNewOperateRightTags as varchar(16)) + '不是2的整数次⽅,不能⽤作权限标志值'end
发布评论