如何通过删除其角色并插入新角色来更新用户的角色?

时间:2011-12-05 05:23:52

标签: c# asp.net

我有以下数据库结构:

用户表:名称,用户名,部门(用户名是主键)

角色表: RoleID,RoleName(RoleID是主键)

UserRole表: UserRoleID,用户名,RoleID(UserRoleID是主键)

我想通过删除当前角色并插入新角色而不是使用UPDATE命令来更新用户的角色,但我不知道该怎么做。

我的ASP.NET代码:

            <div class="content">
                <table>
                    <tr>
                        Current Role:
                        <asp:Label ID="lblRole" runat="server"></asp:Label>
                    </tr>
                    <tr>
                        <asp:Label ID="Label1" runat="server" BackColor="#FFFF99" Font-Bold="True" ForeColor="#000099" />
                        <asp:RadioButtonList ID="radio1" runat="server" TextAlign="left">
                            <asp:ListItem id="option1" runat="server" Value="Admin" />
                            <asp:ListItem id="option2" runat="server" Value="Contribute" />
                            <asp:ListItem id="option3" runat="server" Value="User" />
                        </asp:RadioButtonList>
                        <asp:Button ID="Button1" runat="server" Text="Submit" OnClick="Button1_Clicked" />
                        <span id="infoSpan" runat="server" style="color:Red;"></span>
                    </tr>
                </table>
            </div>

C#代码隐藏:

protected void Button1_Clicked(object sender, EventArgs e)
    {
        //If one of the items is selected AND a username exists in the Username session object update the user role
        if (!String.IsNullOrEmpty(radio1.SelectedValue) && Session["Username"] != null)
        {
            string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psTest;Integrated Security=True";
            string cmdText = "UPDATE Roles SET RoleName = '" + radio1.SelectedValue + "'" +
                "WHERE Username = '" + Session["Username"].ToString() + "'";
            using (SqlConnection conn = new SqlConnection(connString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand(cmdText, conn))
                {
                    cmd.ExecuteScalar();
                    infoSpan.InnerText = String.Format("The users role has been updated to - {0}", radio1.SelectedValue);
                }
            }
        }
    }

修改

我没有使用ASP.NET Membership。我想出了数据库设计,使数据库完全规范化。此外,因为公司可能会要求我同时为用户提供一个以上的角色。

2 个答案:

答案 0 :(得分:1)

我不知道不想使用更新的原因,在我看来这似乎更好,这就是你想要做的事情。

protected void Button1_Clicked(object sender, EventArgs e)
{
        //If one of the items is selected AND a username exists in the Username session object update the user role
        if (!String.IsNullOrEmpty(radio1.SelectedValue) && Session["Username"] != null)
        {
            string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspdb;Integrated Security=True";
            string deleteCommand = "DELETE FROM UserRole where Username=@Username";
            string cmdText = "INSERT INTO UserRole (RoleID,Username) values(@RoleID,@Username)";

            using (SqlConnection conn = new SqlConnection(connString))
            {
                conn.Open();
                //first the delete command
                using (SqlCommand cmd = new SqlCommand(deleteCommand, conn))
                {
                    cmd.Parameters.AddWithValue("@Username",Session["Username"].ToString());
                    cmd.ExecuteNonQuery();
                    //Now the insert
                    cmd.CommandText=cmdText;
                    cmd.Parameters.Clear(); //need this because still has params from del comm
                    cmd.Parameters.AddWithValue("@RoleID",radio1.SelectedValue);
                    cmd.Parameters.AddWithValue("@Username",Session["Username"].ToString());
                    cmd.ExecuteNonQuery();
                    infoSpan.InnerText = String.Format("The users role has been updated to - {0}", radio1.SelectedValue);
                }
            }
        }
}

注意SQLCommands如何使用参数。这是为了避免SQL注入攻击。您拥有的代码很容易被攻击。所有人需要做的是使用与happens on this comic的用户名值类似的东西。

另请注意,我的代码并未在一个事务中包含两个sql语句的执行。这是作为练习留给你的。如果在执行第二个-insert-语句时发生异常,则需要执行此操作。

答案 1 :(得分:0)

  

首先,如果你不是,我会推荐ASP.NET会员模型   已经使用它了。它包含要删除和添加角色的所有命令   来自用户。

     

[http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx] [1]

     

如果你真的想删除然后插入你需要这些   命令:

 DELETE FROM UserRole where UserRoleID='theId'
 INSERT INTO UserRole VALUES (Username, RoleID)
     

或者您可以根据需要通过roleId和用户名进行删除

     

更新:您提到您没有使用ASP.NET成员资格模型   因为您希望数据库完全规范化并可能添加更多数据库   比用户的2个角色。

     

ASP.NET成员资格模型已完全规范化并可以分配   每个用户多个角色。

     

[1]:http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx