zoukankan      html  css  js  c++  java
  • 权限管理之添加用户同时设置角色

    前情提要:

      我们在做权限管理的时候,会用到为用户分配角色。有些做法是,添加完用户再设置角色,这种就没啥了。还有的时候,我们是在添加用户的时候,就为其分配角色。现在就牵扯到一个问题,数据库中的User表的ID是UerRole表的外键,当insert的时候问题就来了。①、可以先插入用户,获得刚插入的UserID,再插入角色,这种方法觉得比较麻烦,而且问题是如果插入用户后,插入角色时失败,用户体验会不好(当然看要求了)。个人比较喜欢下面这种方法:

      使用事务的方式,这样在2个表插入的时候,有一个失败就会回滚,整个都失败。但是,这时刚插入的UserID怎么获得呢?我们知道在插入数据的时候,可以使用@@IDENTITY这个全局变量得到最新插入的主键值。因此,再插入角色时,直接在sql语句中为UserID赋值@@IDENTITY就可以了。

    string sql="insert into UserRole(UserId,RoleId.....) values(@@IDENTITY,@roleid.....)"

      但是设置多个角色时,问题又来了因为@@IDENTITY获得的是最新的插入数据的主键。解决办法是:设置变量存放@@IDENTITY(set @ReturnValue=@@IDENTITY)。

    上代码:使用sql参数化,用@ReturnValue来接收@@IDENTITY,最重要的是要设置@ReturnValue参数为Output。角色表中,@UserId参数设置为ParameterDirection.InputOutput。

    public int AddSetRole(User user, List<UserRole> list)
            {
                //用户表
                StringBuilder userSql = new StringBuilder();
                userSql.Append("insert into Common_Auth_User(");
                userSql.Append("LoginName,LoginPwd,FullName,Email,Phone,Enabled,PwdErrorCount,LoginCount,RegisterTime,LastLoginTime,CreateId,CreateBy,CreateTime,ModifyId,ModifyBy,ModifyTime,IsDeleted)");
                userSql.Append(" values (");
                userSql.Append("@LoginName,@LoginPwd,@FullName,@Email,@Phone,@Enabled,@PwdErrorCount,@LoginCount,@RegisterTime,@LastLoginTime,@CreateId,@CreateBy,@CreateTime,@ModifyId,@ModifyBy,@ModifyTime,@IsDeleted)");
                userSql.Append("; set @ReturnValue=@@IDENTITY ");
                SqlParameter[] parameters = {
                        new SqlParameter("@LoginName", SqlDbType.NVarChar,50),
                        new SqlParameter("@LoginPwd", SqlDbType.NVarChar,50),
                        new SqlParameter("@FullName", SqlDbType.NVarChar,50),
                        new SqlParameter("@Email", SqlDbType.NVarChar,100),
                        new SqlParameter("@Phone", SqlDbType.NVarChar,20),
                        new SqlParameter("@Enabled", SqlDbType.Bit,1),
                        new SqlParameter("@PwdErrorCount", SqlDbType.Int,4),
                        new SqlParameter("@LoginCount", SqlDbType.Int,4),
                        new SqlParameter("@RegisterTime", SqlDbType.DateTime),
                        new SqlParameter("@LastLoginTime", SqlDbType.DateTime),
                        new SqlParameter("@CreateId", SqlDbType.Int,4),
                        new SqlParameter("@CreateBy", SqlDbType.NVarChar,50),
                        new SqlParameter("@CreateTime", SqlDbType.DateTime),
                        new SqlParameter("@ModifyId", SqlDbType.Int,4),
                        new SqlParameter("@ModifyBy", SqlDbType.NVarChar,50),
                        new SqlParameter("@ModifyTime", SqlDbType.DateTime),
                        new SqlParameter("@IsDeleted", SqlDbType.Bit,1),
                        new SqlParameter("@ReturnValue",SqlDbType.Int) };
                parameters[0].Value = user.LoginName;
                parameters[1].Value = user.LoginPwd;
                parameters[2].Value = user.FullName;
                parameters[3].Value = user.Email;
                parameters[4].Value = user.Phone;
                parameters[5].Value = user.Enabled;
                parameters[6].Value = user.PwdErrorCount;
                parameters[7].Value = user.LoginCount;
                parameters[8].Value = user.RegisterTime;
                parameters[9].Value = user.LastLoginTime;
                parameters[10].Value = user.CreateId;
                parameters[11].Value = user.CreateBy;
                parameters[12].Value = user.CreateTime;
                parameters[13].Value = user.ModifyId;
                parameters[14].Value = user.ModifyBy;
                parameters[15].Value = user.ModifyTime;
                parameters[16].Value = user.IsDeleted;
                parameters[17].Direction = ParameterDirection.Output;
    
                List<CommandInfo> lists = new List<CommandInfo>();
                CommandInfo commandInfo = new CommandInfo(userSql.ToString(), parameters);
                lists.Add(commandInfo);
                //用户角色表 添加
    
                int count = list.Count;
                for (int i = 0; i < count; i++)
                {
                    StringBuilder userRoleSql = new StringBuilder();
                    userRoleSql.Append("insert into Common_Auth_UserRole(");
                    userRoleSql.Append("UserId,RoleId,CreateId,CreateBy,CreateTime,ModifyId,ModifyBy,ModifyTime,IsDeleted)");
                    userRoleSql.Append(" values (");
                    userRoleSql.Append("@UserId,@RoleId,@CreateId,@CreateBy,@CreateTime,@ModifyId,@ModifyBy,@ModifyTime,@IsDeleted)");
    
                    SqlParameter[] userRoleParameters = {
                        new SqlParameter("@UserId", SqlDbType.Int),
                        new SqlParameter("@RoleId", SqlDbType.Int,4),
                        new SqlParameter("@CreateId", SqlDbType.Int,4),
                        new SqlParameter("@CreateBy", SqlDbType.NVarChar,50),
                        new SqlParameter("@CreateTime", SqlDbType.DateTime),
                        new SqlParameter("@ModifyId", SqlDbType.Int,4),
                        new SqlParameter("@ModifyBy", SqlDbType.NVarChar,50),
                        new SqlParameter("@ModifyTime", SqlDbType.DateTime),
                        new SqlParameter("@IsDeleted", SqlDbType.Bit,1)
                                                        };
    
                    userRoleParameters[0].Direction=ParameterDirection.InputOutput;
                    userRoleParameters[1].Value = list[i].RoleId;
                    userRoleParameters[2].Value = list[i].CreateId;
                    userRoleParameters[3].Value = list[i].CreateBy;
                    userRoleParameters[4].Value = list[i].CreateTime;
                    userRoleParameters[5].Value = list[i].ModifyId;
                    userRoleParameters[6].Value = list[i].ModifyBy;
                    userRoleParameters[7].Value = list[i].ModifyTime;
                    userRoleParameters[8].Value = list[i].IsDeleted;
    
                    commandInfo=new CommandInfo(userRoleSql.ToString(),userRoleParameters);
                    lists.Add(commandInfo);
                }
    
                
                    DbHelperSQL.ExecuteSqlTranWithIndentity(lists);
                    return (int)parameters[17].Value;
            }

      SqlHelper对应代码:对应sql代码,如果参数为Output,使用变量indentity存储下来,参数为InputOutput时就把先前得到的值赋值。注意这时,ExecuteSqlTranWithIndentity方法的参数为List类型,不能使用HashTable类型(因为无序)。

     public static void ExecuteSqlTranWithIndentity(System.Collections.Generic.List<CommandInfo> SQLStringList)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    using (SqlTransaction trans = conn.BeginTransaction())
                    {
                        SqlCommand cmd = new SqlCommand();
                        try
                        {
                            int indentity = 0;
                            //循环
                            foreach (CommandInfo myDE in SQLStringList)
                            {
                                string cmdText = myDE.CommandText;
                                SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters;
                                foreach (SqlParameter q in cmdParms)
                                {
                                    if (q.Direction == ParameterDirection.InputOutput)
                                    {
                                        q.Value = indentity;
                                    }
                                }
                                PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                                int val = cmd.ExecuteNonQuery();
                                foreach (SqlParameter q in cmdParms)
                                {
                                    if (q.Direction == ParameterDirection.Output)
                                    {
                                        indentity = Convert.ToInt32(q.Value);
                                    }
                                }
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                        }
                        catch
                        {
                            trans.Rollback();
                            throw;
                        }
                    }
                }
            }
    private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();
                cmd.Connection = conn;
                cmd.CommandText = cmdText;
                if (trans != null)
                    cmd.Transaction = trans;
                cmd.CommandType = CommandType.Text;//cmdType;
                if (cmdParms != null)
                {
    
    
                    foreach (SqlParameter parameter in cmdParms)
                    {
                        if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                            (parameter.Value == null))
                        {
                            parameter.Value = DBNull.Value;
                        }
                        cmd.Parameters.Add(parameter);
                    }
                }
            }
  • 相关阅读:
    hdu 3342 Legal or Not 拓排序
    hdu 1596 find the safest road Dijkstra
    hdu 1874 畅通工程续 Dijkstra
    poj 2676 sudoku dfs
    poj 2251 BFS
    poj Prime Path BFS
    poj 3278 BFS
    poj 2387 Dijkstra 模板
    poj 3083 DFS 和BFS
    poj 1062 昂贵的聘礼 dijkstra
  • 原文地址:https://www.cnblogs.com/zhaoyihao/p/4671784.html
Copyright © 2011-2022 走看看