Posts
103
Comments
238
Trackbacks
4
Come generare automaticamente le query di Insert, Update e Delete con VS2005 in presenza di JOIN

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:

  1. 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.
  2. Crei un DataSet tipizzato semplicemente aggiungendo un DataSet al progetto e trascinando le tabelle Clienti e Prenotazioni.
  3. 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.IdClienteas 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

posted on Saturday, March 25, 2006 9:29 PM Print
News

Scopri CS2, il mio progetto universitario per l'indicizzazione e la ricerca di codice sorgente personale costruito su Lucene.Net.

Windows Developer Power Tools

Potete trovare il mio progetto BusyBoxDotNet nel libro Windows Developer Power Tools, pubblicato da O'Reilly, per il quale ho scritto l'intero capito dedicato.

Sono stato nominato dVP 2008, un riconoscimento per l'apporto fornito alla comunità del progetto db4o.