Вопрос

Я ломал над этим голову, и я уверен, что просто упускаю из виду что-то очевидное, но...

У меня есть таблица в базе данных клиента, которая в основном:

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.Фактически вы сохраняете данные в улучшенном дизайне, но для существующего приложения вы возвращаете их обратно.Это может сработать, если только вам не нужно выполнять обновления, пока это находится в сводном дизайне.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top