none
Dataset, DataRow e recupero degli ID RRS feed

  • Discussione generale

  • Ciao a tutti,

    ho in mano un vecchio progetto che accede ad un database (nello specifico SQL Server); per recuperare, aggiornare, inserire dati nel db, viene utilizzato un approccio "manuale", quindi lanciando delle query direttamente tramite oggetti SQLCommand ecc., quindi niente Entity Framework, niente roba più moderna.

    E' spuntata fuori la necessità di atomizzare alcune procedure, senza sconvolgere troppo il progetto, e la cosa più facile ed immediata è usare un DataSet e relativo DataAdapter per lavorare sui dati. Questo DataSet è ottenuto lanciando una query sul db, senza l'utilizzo di Wizard.

    Ammettiamo l'utilizzo di una semplice tabella che ha un campo ID, di tipo intero, autoincrementale e usato come chiave primaria, ed un campo Nome di tipo testo. Supponiamo di voler controllare, eventualmente cancellare ed inserire nuovi nomi che iniziano per "Ma".

    Per recuperare i dati, in maniera molto semplice lancio una query con un 

    Select ID, Nome From Tabella Where Name Like 'Ma%'

     Tramite un SqlCommand ed un SqlDataAdapter, lancio la query ed ottengo il DataSet relativo.

    A questo punto posso accedere alla DataTable ed alle relative DataRow, posso quindi tranquillamente cancellare le righe che non servono più, modificare le righe che voglio modificare e fin qui nessun problema. L'inghippo nasce quando voglio aggiungere una riga.

    Naturalmente posso usare prima il metodo NewRow della DataTable, valorizzare tutti i campi della riga e poi chiamare il metodo Add della DataRowCollection proprio della DataTable, ma in questo momento il valore del campo ID della riga NON è lo stesso del valore che ci sarà nel db, e d'altronde non sarebbe possibile perché ancora non è stato effettuato l'update del database attraverso il DataSet ed il DataAdapter. In questo momento il campo ID è valorizzato con il valore successivo del più alto ID letto nella query. Ammettiamo cioè che io abbia ricevuto 2 record, uno con ID = 4 ed l'altro con ID = 7, la nuova riga creata avrà come ID il valore di 8 (anche se nel db, una riga con ID = 8 già esiste).

    Una volta lanciato l'update sul database, tutte le righe vengono aggiornate correttamente, e vengono creati nuovi record quanti sono quelli che effettivamente avevo aggiunto, e chiaramente ognuno ha un suo ID, che non necessariamente (anzi molto probabilmente non) sarà quello che avevo come valore ID nelle rispettive DataRow.

    Se però vado a leggere gli ID nelle DataRow, il loro valore è rimasto quello precedente, non rispecchiando quindi ciò che ho memorizzato nel db.

    Dopo tutta questa spiegazione, la domanda è semplice... Come faccio ad ottenere i nuovi ID? Chiaramente non posso rilanciare la query (troppo facile così) perché ciò mi farebbe perdere il riferimento alle DataRow. Per chiarire meglio, i dati sono memorizzati in varie istanze di una classe che ha le proprietà ID e Nome, ed ho bisogno, una volta inseriti i nuovi record nel db, di riportare gli ID assegnati nel database alle relative proprietà ID degli oggetti.

    Idee?

    venerdì 22 maggio 2020 08:55

Tutte le risposte

  • Davvero nessuno ha idea di come fare?

    Mi piacerebbe lasciare Dataset e quant'altro per migrare su EF6, ma quel progetto è particolarmente complesso, per cui al momento eviterei.

    giovedì 30 luglio 2020 09:41