我一直在反对这一点,我确信我只是错过了一些明显的东西,但是......
我在客户的数据库中有一张表,基本上就是:
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个项目,并且不能更改架构(需要考虑其他外部因素)。
但是,为了将其显示在远离用户智能的任何东西中,我们必须将它(通过视图)UNPIVOT(例如):
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感到有些不知所措,因为文本必须在SET中明确命名列,但列名在Item和Note列中是动态的,我可以不要设置所有列,因为每条记录只有一个项目/注释对的数据。
想法?
答案 0 :(得分:1)
您将无法依赖数据绑定将更改发送回原始数据透视表中的数据库。相反,您需要将每个更新捕获为单个“工作单元”。例如,item id = 92,value =“Tom”。也许之前项目92的价值是“乔”。您的工作单位是更改项目92的值。
当用户通过用户界面进行更改时,您可以将每个UOW批处理并保持在一起,直到他们准备好单击保存。当用户请求保存时,每个捕获的UOW都将对数据库“播放”。搜索“命令”模式和/或Jeremy Miller的一些文章。
另一个想法是你说你不能改变架构,但也许你真的可以。考虑创建一个不透明格式的真实表。然后用使用PIVOT命令的视图替换当前表。实际上,您将数据存储在更好的设计中,但是对于现有的应用程序,您可以将其保留回来。除非您需要在轮回设计中进行更新,否则这可能会有效。
最后一个选项是您可以简单地维护两个物理表,然后编写一些复杂的合并操作来定期同步它们。