martedì 27 novembre 2007

Insert nel dataset di VS2005

Usando i typed dataset di VS2005 come data layer si risparmia un sacco di tempo perchè si auto crea tutto uno strato di classi, metodi e query (per SQL: è questo l'ambiente che uso) che possono essere usati dallo strato business sovrastante.

Oggi ho scoperto una cosa alquanto allarmante, almeno fintanto che non lo si sa.

Mi focalizzo sul metodo di insert di una tabella del dataset. Si può sceglere tra text o stored procedure o table direct.
Nel caso si scelga text si può inserire il testo in due modi:
- usando il query builder (cliccando sugli appositi 3 puntini nel campo CommandText delle proprietà);
- inserendo a mano la query (magari facendo un copia/incolla da SQL manager).

C'è però una notevole differenza tra i due metodi: il primo infatti accoda "di soppiatto" un comando di select conforme con il comando di insert appena editato da noi.
Questo select è FONDAMENTALE in quanto serve per riportare i nuovi valori dal database al dataset che, in caso di assenza del select, rimane con i valori vecchi.
Il caso più eclatante si ha quando l'insert interessa delle righe di una tabella che ha un'indice auto-increment: auto-increment sia sul db (con step positivi) sia sul db (con step negativi)*.
In questo caso gli indici delle righe appena INSERITE sul db manterranno l'indice negativo ma cambieranno stato da added a unchanged. Ad un successivo cambio di stato in Modified si genererà una eccezione di mancanza di chiave primaria in fase di UPDATE, in quanto l'adapter farà affidamento sull'indice di riga rimasto negativo e disallineato dal db.



*: sul perchè è utile fare step negativi nel db per indici auto-increment rimando alla documentazione MS.

Nessun commento: