• 权限管理之添加用户同时设置角色


    前情提要:

      我们在做权限管理的时候,会用到为用户分配角色。有些做法是,添加完用户再设置角色,这种就没啥了。还有的时候,我们是在添加用户的时候,就为其分配角色。现在就牵扯到一个问题,数据库中的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);
                    }
                }
            }
  • 相关阅读:
    fenby C语言P21
    fenby C语言 P20
    fenby C语言 P19
    fenby C语言 P18
    fenby C语言 P17
    fenby C语言 P16
    fenby C语言 P15
    fenby C语言 P14
    Python学习之路:subprocess模块和面向对象
    Python学习之路:XML模块
  • 原文地址:https://www.cnblogs.com/zhaoyihao/p/4671784.html
Copyright © 2020-2023  润新知