C'è ingiro un gran quantità di tutorial che spiega come
sia facile utilizzare i nuovi controlli DataSource assieme a GridView, FormView,
DetailsView e giù di lì con i DataSet tipizzati generati automaticamente
trascinando le tabelle dalla scheda Server Explorer.
In poche parole:
- Crei un database e gli aggiungi una tabella o due, senza uscire da VS2005.
Per esempio le tabelle Clienti e Prenotazioni, che sono in
relazione sulla chiave IdCliente (int), che è foreign key per
Prenotazioni.
- Crei un DataSet tipizzato semplicemente aggiungendo un DataSet al progetto
e trascinando le tabelle Clienti e Prenotazioni.
- Crei una nuova webform e gli tiri dentro una GridView, una DetailsView o
una FormView, creando un nuovo ObjectdataSource che faccia riferimento ad un
metodo di uno dei due TableAdapters creati automaticamente in
precedenza.
Il gioco è fatto, in 2 minuti si possono visualizzare, modificare eliminare
ed aggiungere tuple in abbondanza.
Il problema, penso già sollevato più volte, è che rendendo così facile
effettuare queste semplici operazioni si rende più complicato di quanto non
fosse prima effettuare delle deviazioni dal percorso forzato che in questo modo
viene più o meno imposto.
Non fraintendetemi, in realtà le cose non diventano più difficili in sé
stesse, ma bisogna capire come LUI vuole che le cose siano fatte adesso, che è
una deviazione dal modo precedente di pensare che a volte non è così immediata.
Mi spiego meglio.
Supponiamo di aver creato una pagina contenente una FormView che visualizza
le Prenotazioni.
Abbiamo tutti i nostri bei dati della prenotazione ma abbiamo anche un campo
IdCliente, che essendo un intero non ci dice molto.
Visualizzare (e selezionare) il nome del cliente in modalità modifica o
inserimento non è difficile, perchè basta che al posto della TextBox di default
si metta una DropDownList "bindata" in modo opportuno ed il gioco è fatto, ma in
visualizzazione (ossia in ItemTemplate) con una label? Non si riesce, se non con
giri strani (tipo mettere una DropDownList invisibile, ma mi è venuto in mente
adesso, non so se in realtà si può fare...).
Per farlo bisogna modificare le query dei TableAdapters, andando in JOIN con
la tabella Clienti e tirandosi dentro un dato, tipo il nome, che sia un po' più
significativo dell'Id.
Bene, andiamo a modificare la query di select della classe
PrenotazioniTableAdapter, che prima era semplicemente
SELECT *
FROM Prenotazioni
facendo un join con Clienti, del tipo:
SELECT Prenotazioni.*, Clienti.NomeCliente
FROM Prenotazioni INNER JOIN Clienti ON Prenotazioni.IdCliente = Clienti.IdCliente
Bello no?... magari, e invece BOOM, le query di
inserimento, modifica e cancellazione non vengono più autogenerate... E allora a
che cavolo mi serve? Tanto vale che faccia tutto a mano!
In questo caso, per fortuna, c'è un workaround, insiegabile a mio avviso, ma
che funziona. Non è di mia invenzione ma viene da un post di Scott Guthrie (i
link sono alla fine). Appena l'ho visto infatti mi sono chiesto perchè mai
avesse fatto la query in questo modo, a me non hanno mai insegnato a farle così;
poi provando mi sono reso conto che evidentemente è l'unico modo per far si che
VS2005 riesca a generate automaticamente le query di aggiornamento,
cancellazione e inserimento.
La query sopra deve essere scritta in questo modo:
SELECT Prenotazioni.*,
(SELECT Clienti.NomeCliente
FROM Clienti
Where IdCliente = Prenotazioni.IdCliente) as NomeCliente
FROM Prenotazioni
Il risultato è equivalente, ma in questo modo VS2005 riesce a generare tutti
gli altri comandi da solo. Sarà che non gli piacciono i JOIN...
Sapendolo è tutto facile, ma senza saperlo la strada è un po' più lunghina
eh!
LINKS: Building a
DAL using Strongly Typed TableAdapters and DataTables in VS 2005 and ASP.NET
2.0, Scott Guthrie.
powered by IMHO 1.3