我有以下数据库结构:
用户表:名称,用户名,部门(用户名是主键)
角色表: 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。我想出了数据库设计,使数据库完全规范化。此外,因为公司可能会要求我同时为用户提供一个以上的角色。
答案 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成员资格模型已完全规范化并可以分配 每个用户多个角色。