Обновление необработанной таблицы SQL
Вопрос
Я ломал над этим голову, и я уверен, что просто упускаю из виду что-то очевидное, но...
У меня есть таблица в базе данных клиента, которая в основном:
Item_Set_Key int
Item_1 bit
Notes_1 nvarchar(80)
Item_2 bit
Notes_2 nvarchar(80)
Item_3 bit
Notes_3 nvarchar(80)
...
В каждой записи содержится 99 элементов, и никакое изменение схемы не является вариантом (задействованы другие внешние соображения).
Однако, чтобы отобразить его в виде чего-либо, отдаленно напоминающего интеллект для пользователя, мы должны ОТКЛЮЧИТЬ его (через представление) следующим образом:
SELECT i.Item_Set_Key, i.Item_Number, i.Selected, i.Item, i2.Notes, i2.Note
FROM (
SELECT Item_Set_Key, SUBSTRING (Item, 6, 2) AS Item_Number, Selected, Item
FROM Item_Set
UNPIVOT (Selected FOR Item IN
(Item_1, Item_2, Item_3, Item_4, Item_5, ...)
) as u
) AS i
LEFT JOIN (
SELECT Item_Set_Key, SUBSTRING (Note, 7, 2) AS Item_Number, Notes
FROM Item_Set
UNPIVOT (Notes FOR Note IN
(Notes_1, Notes_2, Notes_3, Notes_4, Notes_5, ...)
) as n
) AS i2 ON i2.Item_Set_Key = i.Item_Set_Key
AND i2.Item_Number = i.Item_Number
Я выполняю стандартную привязку этого к сетке.Однако я в некоторой растерянности относительно того, как создать для него команду UpdateCommand , потому что текст должен был бы явно указывать столбец в НАБОРЕ, но имена столбцов являются динамическими в столбцах Item и Note, и я не могу просто задать все столбцы, потому что каждая запись будет содержать данные только для одной пары item / note .
Идеи?
Решение
Вы не сможете полагаться на привязку данных для отправки изменений обратно в базу данных в исходной сводной таблице.Вместо этого вам нужно фиксировать каждое обновление как отдельную "единицу работы". Например, идентификатор элемента = 92, значение ="Tom".Возможно, ранее значением элемента 92 было "Джо". Ваша задача здесь - изменить значение для элемента 92.
Когда пользователь вносит изменения через пользовательский интерфейс, вы можете объединить каждый UOW в пакет и удерживать их до тех пор, пока они не будут готовы нажать кнопку сохранить.Когда пользователь запрашивает сохранение, каждый захваченный UOW "воспроизводится" в базе данных.Поищите шаблон "команда" и / или некоторые статьи Джереми Миллера.
Другая мысль заключается в том, что вы сказали, что не можете изменить схему, но, возможно, вы действительно можете.Рассмотрите возможность создания реальной таблицы в формате unpivoted.Затем замените текущую таблицу представлением, использующим команду PIVOT.Фактически вы сохраняете данные в улучшенном дизайне, но для существующего приложения вы возвращаете их обратно.Это может сработать, если только вам не нужно выполнять обновления, пока это находится в сводном дизайне.
Последний вариант заключается в том, что вы могли бы просто поддерживать две физические таблицы, а затем написать какую-нибудь сложную операцию слияния, чтобы периодически синхронизировать их.