【问题标题】:How to update the role of the user by deleting its role and inserting a new role?如何通过删除角色并插入新角色来更新用户的角色?
【发布时间】:2011-12-05 05:23:52
【问题描述】:

我有以下数据库结构:

用户表:姓名、用户名、部门(用户名为主键)

角色表: RoleID、RoleName(RoleID为主键)

UserRole表: UserRoleID、Username、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 成员资格。我想出了数据库设计来使数据库完全规范化。另外,因为公司可能会要求我同时给用户一个角色。

【问题讨论】:

  • 我猜你应该更新而不是删除和插入。
  • 提供更多细节...您使用的是 aspnet 会员吗?
  • 我不明白你在UserRole表中提到:UserRoleID和RoleID有什么区别...

标签: c# asp.net


【解决方案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- 语句时发生异常。

【讨论】:

  • 感谢您的帮助。但是当我尝试执行它时,最后一个 cmd.ExecuteNonQuery(); 出现错误
  • 它给了我这个错误的黄页:(无效的列名'RoleName'。)用红色着色最后一个(cmd.ExecuteNonQuery();)
  • @user976711:嗯,错误非常明显,您应该能够轻松修复它:它清楚地表明列 RoleName 无效并且显然 无效.它应该是RoleID(查看您发布的架构)。我会更新我的答案,但老兄,这很容易检测和修复,你应该自己做。
【解决方案2】:

首先,如果您不是,我会推荐 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2018-11-04
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    相关资源
    最近更新 更多