更新sql表中的多行以进行复选框选择

时间:2014-01-10 20:23:03

标签: c# asp.net sql database

我想根据用户选择的部门复选框更新我的dbo.userDepartment表(链接到dbo.User和dbo.Department的中间表)。

在我的后端页面上,我有两个对象,Department和DepartmentCollection。

部门有DeptId,DeptName

DepartmentCollection是一个列表

在我的前端页面上,我将用户的所有部门选项显示为选择或取消选择

当我点击编辑用户页面上的保存时,我想更新dbo.userDepartment。

我的问题是,我该怎么做才能成功更新:

  1. 用户最初选择但现已取消选择的部门。
  2. 用户之前未选择但现在已选中的部门。
  3. 尚未被选中的部门。
  4. 如何编写存储过程以实现我想要的? 我正在考虑传入一个deptid数组,并将数组与存储在数据库中的数据进行比较。删除记录或根据我传入的数组中是否存在id来插入记录。

    到目前为止,这是我能想到的。有什么建议吗?谢谢。

2 个答案:

答案 0 :(得分:0)

假设您的用户ID = 1且属于ID = 1..5的5个部门。 页面更新后,用户属于部门3..7。

进行更新的最简单方法(伪代码)

 Start A Transaction
 DELETE FROM userDepartment WHERE UserID=1
 for each department choosen
    INSERT INTO userDepartment (userID, deparmentID) values (1, departmentIDChoosen)
 Next
 Commit Transaction

我认为这不是一项重大而明显的资源枯竭。我们在谈论10/20记录吗?最好的方法是将Table Valued Parameter传递给存储过程,以便只调用一次数据库

在您的数据库中,为TVP参数和storedprocedure

创建TYPE
CREATE TYPE dbo.UserDeptTableType AS TABLE
    ( UserID int, DeptID int )

CREATE PROCEDURE usp_UpdateUserDepartment
(@userID int, @tbpNewDepts dbo.UserDeptTableType READONLY)
AS
BEGIN TRANSACTION T1
    DELETE FROM userDepartment WHERE UserID=@userID
    INSERT INTO dbo.userDepartment (UserID, DeptID)
    SELECT ud.UserID, ud.DeptID FROM @tvpNewDepts AS ud
COMMIT TRANSACTION T1
在您的C#代码中

使用userID和DeptID创建表并将其传递给存储过程

using (connection)
{
      DataTable depts = GetUserIDWithDepartments();
      SqlCommand insertCommand = new SqlCommand("usp_UpdateUserDepartment", connection);
      insertCommand.CommandType = CommandType.StoredProcedure;
      insertCommand.Parameters.AddWithValue("@userID", currentUserID);
      SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@tvpNewDepts", depts);
      tvpParam.SqlDbType = SqlDbType.Structured;
      insertCommand.ExecuteNonQuery();
}

答案 1 :(得分:0)

我不确定这里是否足够了。上面列出的三个状态是否在userDepartment表中以不同的方式表示?

如果是这样,那么单独的存储过程将无法在没有得到UI的帮助的情况下实现这一点,这当然需要从数据库中选择的原始状态。

在第1点 - 用户选择然后在回发之前取消选中复选框属于此类别,还是3?

当您在第2点说'之前没有选择'时 - 是'之前没有选择过',或者这次是在这个时候呈现页面时没有被选中,但可能已被选中,之后在某个时候被取消选择在过去?

如果某些或所有这些都是真的,那么您需要定义复选框的所有可能状态,以便在保存页面时,然后给出复选框的先前状态和操作(检查或取消选中)在页面上发生的情况,你知道它需要转换到什么状态。