您的位置:首页 > 其它

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

2015-07-23 21:03 435 查看
前情提要:

  我们在做权限管理的时候,会用到为用户分配角色。有些做法是,添加完用户再设置角色,这种就没啥了。还有的时候,我们是在添加用户的时候,就为其分配角色。现在就牵扯到一个问题,数据库中的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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: