Domanda

Ho battendo la testa contro questo, e sono sicuro che mi manca solo una cosa ovvia, ma ...

Ho una tabella nel database di un cliente, che è fondamentalmente:

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

Ci sono 99 articoli in ogni record, e senza cambiare lo schema non è un'opzione (altre considerazioni esterni coinvolti).

Tuttavia, al fine di visualizzarlo in qualcosa di lontanamente simile intelligenza per l'utente, dobbiamo UNPIVOT esso (tramite un View) in questo modo:

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

faccio il bind standard che alla griglia. Tuttavia, sono in una sorta di perdita su come costruire l'UpdateCommand per esso, perché il testo avrebbe dovuto nominare esplicitamente la colonna nel set, ma i nomi delle colonne sono dinamiche nelle colonne elemento e nota, e posso 't basta impostare tutte le colonne perché ogni record avrebbe solo i dati per un elemento coppia / note.

idee?

È stato utile?

Soluzione

Non sarà in grado di contare su di associazione dati per inviare le modifiche al database nella tabella imperniato originale. Invece è necessario catturare ogni aggiornamento come una singola "unità di lavoro". Ad esempio, elemento id = 92, value = "Tom". Forse in precedenza il valore dell'articolo 92 era "Joe". La vostra unità di lavoro è quello di modificare il valore per la voce 92.

Come utente apporta modifiche tramite l'interfaccia utente si può ammucchiare insieme ogni UOW e tenere su di loro fino a quando sono pronti a fare clic su Salva. Quando l'utente richiede il salvataggio, ogni UOW catturata viene "suonato" a fronte del database. Cercare in giro per il modello di "comando" e / o di alcuni articoli del Jeremy Miller.

Un altro pensiero è che ha detto non si può cambiare lo schema, ma forse si può davvero. Considerare la creazione di un tavolo vero e proprio che è nel formato pivot. Quindi sostituire la tabella corrente con una vista che utilizza il comando PIVOT. In effetti si memorizzano i dati in un design migliore, ma per l'applicazione esistente si pivot indietro. Questo potrebbe funzionare a meno che non avete bisogno di fare gli aggiornamenti mentre è nella progettazione basculante.

Ultima opzione è si può semplicemente mantenere due tabelle fisiche e poi scrivere qualche operazione di unione complessa per sincronizzare periodicamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top