2014-01-10 11 views
1

Я хотел бы обновить таблицу dbo.userDepartment (средняя таблица, которая ссылается на dbo.User и dbo.Department) на флажках отдела, которые пользователь выбрал.Обновление нескольких строк в таблице sql для выбора флажка

На моей внутренней странице у меня есть два объекта: Department и DepartmentCollection.

Департамент имеет DeptId, DEPTNAME

DepartmentCollection список

На моей странице внешнего интерфейса, отобразить все параметры Универмаги для пользователя выбрать или отменить выбор.

Когда я нажимаю «Сохранить» на моей странице «Редактировать пользователя», я хотел бы обновить dbo.userDepartment.

Моя проблема в том, как я могу это сделать, так что я могу успешно обновить:

  1. отдел, который пользователь изначально выбран, но теперь отменен.
  2. Отдел, который пользователь еще не выбрал, но теперь выбран.
  3. Отдел, который остается невыбранным.

Как я могу написать свою хранимую процедуру для достижения того, что я хочу? Я думаю о передаче в массив дефитов и сравнить массив с тем, что хранится в базе данных. удалите запись или вставьте запись, основанную на том, существует ли идентификатор в массиве i.

Это то, что я могу представить до сих пор. Любое предложение? Спасибо.

+0

В таблице userDepartment хранятся только записи UserID & DepartmentID, выбранные пользователем? – Steve

+0

В одной транзакции уничтожьте все существующие записи и замените их на те, которые основаны на значениях со страницы. –

+0

Проблема здесь заключается в удалении строки, принадлежащей отделу, который был первоначально выбран, но теперь отменен. Потому что, если я только передаю идентификаторы всех выбранных отделов, я не знаю, какой из них удалить. –

ответ

0

Предположим, что ваш пользователь имеет идентификатор = 1 и принадлежит 5 отделам с идентификатором = 1..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# создать таблица с идентификатором пользователя и 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» или мне нужно передать массив целых чисел? Извините, я новичок и не очень хорошо знаком с типом сказки. Можете ли вы подробнее рассказать об этом? Спасибо. –

+0

Нет, я не детализировал 'GetUserIDWithDepartments()' Это должно создать DataTable, добавить два целочисленных столбца с требуемыми именами, а затем, зациклившись на выбранных флажках, добавьте строку, состоящую из userid и deptid. DataTable передается как хранимая процедура. Всего один вызов в базе данных (и это наиболее ресурсоемкая задача, задействованная здесь) – Steve

0

я не уверен, есть ли достаточно, чтобы пойти на здесь. Являются ли перечисленные выше три государства по-разному представлены в таблице userDepartment?

Если это так, то сама хранимая процедура не сможет достичь этого, не получая какой-либо помощи от пользовательского интерфейса, что, конечно же, требует исходного состояния выбора из базы данных.

В пункте 1 - пользователь выбирает и отменяет выбор флажка перед тем, как обратная передача попадет в эту категорию, или это будет 3?

Когда вы говорите «не выбрано до» в пункте 2 - это «никогда не было выбрано раньше» или просто не было выбрано, когда страница была отображена на этот раз, но, возможно, была выбрана и впоследствии отменена на некоторых в прошлом?

Если некоторые или все из них являются истинными, то вам необходимо определить все возможные состояния флажка, чтобы при сохранении страницы, после того, как было указано предыдущее состояние флажка, и действие (либо отметьте, либо снимите флажок), который произошел на странице, вы знаете, к какому состоянию он должен быть переведен.

+0

№. Мой dbo.UserDepartments имеет только две колонки. UserId и DeptId. –

+0

В этом случае ответ выше находится на правильных строках. Предположительно, таблица индексируется UserId, поэтому просто удалите строки этого пользователя и вставьте последний выбор. – barrick

Смежные вопросы