我想根据用户选择的部门复选框更新我的dbo.userDepartment表(链接到dbo.User和dbo.Department的中间表)。
在我的后端页面上,我有两个对象,Department和DepartmentCollection。
部门有DeptId,DeptName
DepartmentCollection是一个列表
在我的前端页面上,我将用户的所有部门选项显示为选择或取消选择。
当我点击编辑用户页面上的保存时,我想更新dbo.userDepartment。
我的问题是,我该怎么做才能成功更新:
如何编写存储过程以实现我想要的? 我正在考虑传入一个deptid数组,并将数组与存储在数据库中的数据进行比较。删除记录或根据我传入的数组中是否存在id来插入记录。
到目前为止,这是我能想到的。有什么建议吗?谢谢。
答案 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
创建TYPECREATE 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点说'之前没有选择'时 - 是'之前没有选择过',或者这次是在这个时候呈现页面时没有被选中,但可能已被选中,之后在某个时候被取消选择在过去?
如果某些或所有这些都是真的,那么您需要定义复选框的所有可能状态,以便在保存页面时,然后给出复选框的先前状态和操作(检查或取消选中)在页面上发生的情况,你知道它需要转换到什么状态。