实例介绍
【实例简介】
C# WinForm中实现基于角色的权限菜单的完整源码,数据库脚本在DBscript目录下,在sql server 依次执行如下脚本即可
执行完毕后 修改下 app.config中的数据库连接串 为你本机的即可
【实例截图】
下面为管理员登陆后的效果
管理员账号:admin
密码:666666
下面为普通用户登陆后的效果:
普通用户名:user 密码 111111
【核心代码】
/// <summary> /// 根据操作员名称和密码获取操作员实体 /// </summary> /// <param name="name">操作员名称</param> /// <param name="pwd">操作员密码</param> /// <returns>操作员实体</returns> public Model.Operator GetOperatorInfoByName(string name, string pwd) { //SQL命令 string sqltxt = string.Format("Select Id, OperatorName, Password, RightsList, State From Operator Where OperatorName = '{0}' And Password = '{1}'", name, pwd); //创建操作员实体 Model.Operator tmpOperator = new Model.Operator(); // 转换数据库存储的 二进制数据为 Byte[] 数组 以便进而转换为操作员权限集合 // 从配置文件读取连接字符串 string connectionString = ConfigurationManager.ConnectionStrings["SQLSERVER"].ConnectionString; // 执行 SQL 命令 using (SqlConnection conn = new SqlConnection(connectionString)) { SqlCommand cmd = new SqlCommand(sqltxt, conn); conn.Open(); using (SqlDataReader myReader = cmd.ExecuteReader( CommandBehavior.CloseConnection | CommandBehavior.SingleResult | CommandBehavior.SingleRow)) { if (myReader.Read()) { //将数据集转换成实体集合 tmpOperator.Id = Convert.ToInt32(myReader["Id"]); tmpOperator.ModelName = Convert.ToString(myReader["OperatorName"]); tmpOperator.Password = Convert.ToString(myReader["Password"]); tmpOperator.State = Convert.ToBoolean(myReader["State"]); // 读取权限集合 System.Data.SqlTypes.SqlBytes bytes = myReader.GetSqlBytes(3); // 只能指定列序号 // 将流反序列化为权限集合对象 BinaryFormatter bf = new BinaryFormatter(); if (!bytes.IsNull) tmpOperator.RightsCollection = (bf.Deserialize(bytes.Stream) as Dictionary<string, Model.Rights>); //else // throw new Exception(string.Format("操作员 [{0}] 没有任何权限,禁止登录!", tmpOperator.ModelName)); } else //如果没有读取到内容则抛出异常 throw new Exception("登录名称或用户密码不正确!"); } } // 如果操作员已经被禁用 if (!tmpOperator.State) throw new Exception(string.Format("操作员 [{0}] 已被禁用,请与管理员联系!", tmpOperator.ModelName)); // 返回结果 return tmpOperator; } /// <summary> /// 添加操作员 /// </summary> /// <param name="addOperator">要添加的操作员实体</param> /// <returns>True:成功/False:失败</returns> public bool AddOperator(Model.Operator addOperator) { // 验证密码长度 if (addOperator.Password.Trim().Length < 6) throw new Exception("用户密码长度不能小于六位!"); // 转换操作员权限集合为数据库可存取的 Byte[] 数组 MemoryStream ms = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, addOperator.RightsCollection); byte[] rigthsByteArray = new byte[(int)(ms.Length)]; ms.Position = 0; ms.Read(rigthsByteArray, 0, (int)(ms.Length)); ms.Close(); // 拼接 SQL 命令 string sqlTxt = "Insert Into Operator (OperatorName, Password, RightsList, State) Values " "(@OperatorName, @Password, @RightsList, @State)"; // 从配置文件读取连接字符串 string connectionString = ConfigurationManager.ConnectionStrings["SQLSERVER"].ConnectionString; // 执行 SQL 命令 using (SqlConnection conn = new SqlConnection(connectionString)) { SqlCommand cmd = new SqlCommand(sqlTxt, conn); SqlParameter prm1 = new SqlParameter("@OperatorName", SqlDbType.NVarChar, 50); prm1.Value = addOperator.ModelName; SqlParameter prm2 = new SqlParameter("@Password", SqlDbType.NVarChar, 50); prm2.Value = addOperator.Password; SqlParameter prm3 = new SqlParameter("@RightsList", SqlDbType.VarBinary, rigthsByteArray.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, rigthsByteArray); SqlParameter prm4 = new SqlParameter("@State", SqlDbType.Bit); prm4.Value = addOperator.State; cmd.Parameters.AddRange(new SqlParameter[] { prm1, prm2, prm3, prm4 }); conn.Open(); if (cmd.ExecuteNonQuery() >= 1) return true; else return false; } } /// <summary> /// 删除操作员 /// </summary> /// <param name="id">要删除的操作员 ID</param> /// <returns>True:成功/False:失败</returns> public bool DeleteOperatorByID(int id) { // 删除单个信息 SQL 命令 string sqlTxt = string.Format("Delete From Operator Where Id = {0}", id); // 创建 SQL 执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance(); // 执行 删除操作 int rowsAffected; dbProvider.RunCommand(sqlTxt, out rowsAffected); if (rowsAffected >= 1) return true; else return false; } /// <summary> /// 修改操作员 /// </summary> /// <param name="currentOperator">要修改的操作员实体</param> /// <returns>True:成功/False:失败</returns> public bool ModifyOperator(Model.Operator currentOperator) { // 验证密码长度 if (currentOperator.Password.Trim().Length < 6) throw new Exception("用户密码长度不能小于六位!"); // 转换操作员权限集合为数据库可存取的 Byte[] 数组 MemoryStream ms = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, currentOperator.RightsCollection); byte[] rigthsByteArray = new byte[(int)(ms.Length)]; ms.Position = 0; ms.Read(rigthsByteArray, 0, (int)(ms.Length)); ms.Close(); // 拼接 SQL 命令 string sqlTxt = "Update Operator Set OperatorName = @OperatorName, " "Password = @Password, RightsList = @RightsList, State = @State Where Id = @Id"; // 从配置文件读取连接字符串 string connectionString = ConfigurationManager.ConnectionStrings["SQLSERVER"].ConnectionString; // 执行 SQL 命令 using(SqlConnection conn = new SqlConnection(connectionString)) { SqlCommand cmd = new SqlCommand(sqlTxt, conn); SqlParameter prm1 = new SqlParameter("@OperatorName", SqlDbType.NVarChar, 50); prm1.Value = currentOperator.ModelName; SqlParameter prm2 = new SqlParameter("@Password", SqlDbType.NVarChar, 50); prm2.Value = currentOperator.Password; SqlParameter prm3 = new SqlParameter("@RightsList", SqlDbType.VarBinary, rigthsByteArray.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, rigthsByteArray); SqlParameter prm4 = new SqlParameter("@State", SqlDbType.Bit); prm4.Value = currentOperator.State; SqlParameter prm5 = new SqlParameter("@Id", SqlDbType.Int); prm5.Value = currentOperator.Id; cmd.Parameters.AddRange(new SqlParameter[] { prm1, prm2, prm3, prm4, prm5 }); conn.Open(); if (cmd.ExecuteNonQuery() >= 1) return true; else return false; } } /// <summary> /// 获取所有操作员信息 /// </summary> /// <returns>操作员实体集合</returns> public Dictionary<string, Model.Operator> GetAllOperatorInfo() { //SQL命令 string sqltxt = "Select Id, OperatorName, Password, RightsList, State From Operator"; //创建操作员实体集合 Dictionary<string, Model.Operator> operatorCollection = new Dictionary<string, Model.Operator>(); //定义操作员实体 Model.Operator tmpOperator = null; // 转换数据库存储的 二进制数据为 Byte[] 数组 以便进而转换为操作员权限集合 // 从配置文件读取连接字符串 string connectionString = ConfigurationManager.ConnectionStrings["SQLSERVER"].ConnectionString; // 执行 SQL 命令 using (SqlConnection conn = new SqlConnection(connectionString)) { SqlCommand cmd = new SqlCommand(sqltxt, conn); conn.Open(); using (SqlDataReader myReader = cmd.ExecuteReader( CommandBehavior.CloseConnection)) { while (myReader.Read()) { // 创建操作员实体 tmpOperator = new Model.Operator(); //将数据集转换成实体集合 tmpOperator.Id = Convert.ToInt32(myReader["Id"]); tmpOperator.ModelName = Convert.ToString(myReader["OperatorName"]); tmpOperator.Password = Convert.ToString(myReader["Password"]); tmpOperator.State = Convert.ToBoolean(myReader["State"]); // 读取权限集合 System.Data.SqlTypes.SqlBytes bytes = myReader.GetSqlBytes(3); // 只能指定列序号 // 将流反序列化为权限集合对象 BinaryFormatter bf = new BinaryFormatter(); if (!bytes.IsNull) tmpOperator.RightsCollection = (bf.Deserialize(bytes.Stream) as Dictionary<string, Model.Rights>); // 添加到操作员实体集合 operatorCollection.Add(tmpOperator.ModelName, tmpOperator); } } } // 返回结果 return operatorCollection; } /// <summary> /// 根据操作员名称校验操作员是否存在 /// </summary> /// <param name="operatorName">操作员名称</param> /// <returns>True:存在/Flase:不存在</returns> public bool CheckOperatorExist(string operatorName) { //创建查询信息的 SQL string sqlTxt = string.Format( "Select Count(*) From Operator Where OperatorName = '{0}'", operatorName); //创建SQL执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance(); //执行查询操作 int result = Convert.ToInt32(dbProvider.RunCommand(sqlTxt)); if (result >= 1) return true; else return false; } #endregion
相关软件
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)