2014-01-10 36 views
1

我想根據用戶選擇的Department複選框更新我的dbo.userDepartment表(一個鏈接到dbo.User和dbo.Department的中間表)。更新複選框選擇的sql表中的多行

在我的後端頁面上,我有兩個對象Department和DepartmentCollection。

處有DEPTID,DEPTNAME

DepartmentCollection是一個列表

在我的前端頁面,我顯示所有用戶的部門選項選擇或取消

當我點擊保存在我的編輯用戶頁面上時,我想更新dbo.userDepartment。

我的問題是,我怎麼能做到這一點,所以我可以成功更新:

  1. 處瞭解到用戶最初選擇,但現在取消。
  2. 用戶以前未選擇但現在被選中的部門。
  3. 未選中的部門。

如何編寫我的存儲過程來實現我想要的? 我在考慮傳入一個deptid數組,並將數組與存儲在數據庫中的內容進行比較。刪除一條記錄或根據我傳入的數組中是否存在id來插入一條記錄。

這是我至今所能想到的。任何建議?謝謝。

+0

在userDepartment表中,您是否只存儲用戶選擇的記錄UserID&DepartmentID? – Steve

+0

在一次交易中,清除所有現有記錄,並根據頁面中的值替換它們。 –

+0

這裏的問題實際上是關於刪除屬於最初選擇但現在被取消選擇的部門的行。因爲如果我只通過所有選定的部門的ID,我不知道要刪除哪一個。 –

回答

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的

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 [email protected] 
    INSERT INTO dbo.userDepartment (UserID, DeptID) 
    SELECT ud.UserID, ud.DeptID FROM @tvpNewDepts AS ud 
COMMIT TRANSACTION T1 
在你的C#代碼

創建表用戶ID和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(); 
} 
+0

看到我上面的最後一條評論。有沒有更節省資源的方法? –

+0

好的。我猜你是對的。它可能不像我想象的那麼昂貴。還有一個問題,我如何處理@tvpNewDepts參數?我的部門應該是像「1,2,3」這樣的ID字符串,還是應該傳遞一個整數數組?對不起,我是新手,對故事類型不太熟悉。你能詳細解釋一下嗎?謝謝。 –

+0

不,我沒有詳細介紹'GetUserIDWithDepartments()'這應該創建一個DataTable,添加兩個具有所需名稱的整數列,然後在選定的複選框上循環添加由userid和deptid組成的行。 DataTable按原樣傳遞給存儲過程。只需調用一次數據庫(這是此處涉及的最耗費資源的任務) – Steve

0

我不確定是否有足夠的可用性在這裏。上面列出的三種狀態在userDepartment表中是不同的表示形式嗎?

如果是這樣,那麼存儲過程本身就無法實現這一點,而無需UI提供一些幫助,這當然需要從數據庫中選擇原始狀態。

關於第1點 - 用戶選擇然後在回發之前取消選中複選框屬於此類別,還是3?

當你在第2點說'未被選擇' - 是'之前沒有選擇過',或者當這個時候頁面被渲染時沒有被選擇,但可能已經被選擇並且稍後在某些時候被取消選擇點過去?

如果其中的一些或全部屬實,那麼您需要定義複選框的所有可能狀態,以便在頁面保存時,然後給定複選框的先前狀態以及操作(選中或取消選中)發生在頁面上,你知道它需要轉換到什麼狀態。

+0

不,我的dbo.UserDepartments只有兩列。 UserId和DeptId。 –

+0

在這種情況下,上面的答案是正確的。據推測,該表由UserId索引,因此只需清除該用戶的行並重新插入最新的選擇。 – barrick