Pergunta

Eu estive batendo com a cabeça contra isso, e tenho certeza que eu só estou faltando alguma coisa óbvia, mas ...

Eu tenho uma tabela no banco de dados de um cliente, que é basicamente:

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)
...

Há 99 itens em cada registro, e sem alterar o esquema não é uma opção (outras considerações externos envolvidos).

No entanto, a fim de exibi-lo em qualquer coisa remotamente parecida com inteligência para o usuário, temos que UNPIVOT-lo (via a View) como este:

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

Eu faço a ligação padrão de que à rede. No entanto, eu estou em algo de uma perda a respeito de como construir o UpdateCommand para ele, porque o texto teria que nomear explicitamente a coluna no conjunto, mas os nomes das colunas são dinâmicas nas colunas de itens e de nota, e eu posso 't apenas definir todas as colunas, porque cada registro só teria de dados para um item nota par /.

Idéias?

Foi útil?

Solução

Você não será capaz de confiar em dados de ligação para enviar as alterações de volta para o banco de dados na tabela articulada originais. Em vez disso você precisa para capturar cada atualização como uma única "unidade de trabalho." Por exemplo, o item id = 92, value = "Tom". Talvez anteriormente valor do item 92 da era "Joe". Sua unidade de trabalho aqui é para alterar o valor para o artigo 92.

Como o usuário faz alterações através da interface de usuário você agrupe cada UOW e segurá-los até que estejam prontos para clicar em Salvar. Quando o usuário pede para o salvar, cada UOW capturado é "jogado" no banco de dados. Pesquisa em torno para o padrão de "comando" e / ou alguns dos artigos de Jeremy Miller.

Outro pensamento é que você disse que você não pode mudar o esquema, mas talvez você realmente pode. Considere a criação de uma tabela real que está no formato não dinamizado. Em seguida, substitua a tabela atual, tendo em vista que utiliza o comando PIVOT. Na verdade você armazenar os dados em um design melhor, mas para a aplicação existente que você gire-a para trás. Isso poderia funcionar a menos que você precisa fazer atualizações enquanto ele está na concepção articulada.

Última opção é você poderia simplesmente manter duas tabelas físicas e, em seguida, escrever alguma operação de fusão complexa para sincronizá-los periodicamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top