Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 23
  1. #11
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Se io ho 10 tabelle e ne modifico 2 lancio l'UPDATE solo per i tableAdapter di quelle tabelle giusto? Se no ogni mi risposta tutto e in caso di mole di dati cospiqua ruba tempo.
    Se tu modifichi i dati di due tabelle, nell'oggetto DataSet vengono memorizzate le due operazioni eseguite, e se lanci un Update, il DataAdapter lancerà i comandi SQL per riflettere queste modifiche sul database.

    Per quanto concerne le tabelle e i record che non sono stati modificati, il DataAdapter non fa nulla.

    Secondo me, l'idea migliore sarebbe quella di creare un POC (Proof of Concept), cioè un prototipo di progetto che effettua solo le operazioni problematiche, senza coinvolgere nient'altro, e partendo da questo ragionare su quello che ci si aspetta di ottenere e quello che invece viene fatto di diverso.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  2. #12
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110
    Si si è quello che ho fatto! Ho un progetto neutro con 2/3 funzioni...ma continua a non funzionare...

    credo che non riusciamo a capirci perchè quando io parlo di UPDATE mi riferisco ad un comando associato ad una tableAdapter tipizzata che si occupa SOLO di una determinata tabella...

    Ogni datatable (tipizzata) ha il suo tableAdapter che (come da comandi generati INSERT/DELETE ed UPDATE) gestiscono solo quella datatable!
    Ora...alla luce di ciò io mi aspettavo che lanciando l'update di uno di questi tableAdapter venissero trasferite le modifiche SOLO di quella dataTable e successivamente accettate le modifiche SOLO nella dataTable dedicata (col famoso acceptChanges che parte in automatico con l'update)...

    Ma così non è...


    • Io lancio l'update sul tableAdapter dedicato a una datatable specifica
    • lui mi carica i dati aggiornati sul DB solo per quella specifica tabella
    • Marca TUTTE le dataTable come prive di modifiche (l'acceptChanges())
    • sono fregata perchè non posso lanciare l'update dell'altra tabella dacchè non succede nulla essendo marcata come priva di modifiche!


    ...e non mi pare un modo di operare normalissimo....

    Adesso provo a creare un dataAdapter generico che mi aggiorni tutto il DataSet come ha detto Gibra però non capisco a cosa serva allora il comando UPDATE nel tableAdapter dedicato...

    Spero di essermi spiegata un po meglio!
    Grazie ancora per l'aiuto! Sento che siamo vicini alla soluzione
    Ultima modifica di Veronica80; 10-09-2018 a 19:57

  3. #13
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110
    ps: lanciando il tableAdapterManager.updateAll(mioDs) non funziona lo stesso...

    Aggiorna solo la tabella "nomi" e ciao!

  4. #14
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    credo che non riusciamo a capirci perchè quando io parlo di UPDATE mi riferisco ad un comando associato ad una tableAdapter tipizzata che si occupa SOLO di una determinata tabella...
    Come da documentazione, il TableAdapter utilizza le relazioni e si occupa di aggiornare anche le tabelle correlate.

    Si tratta di un oggetto che coordina il lavoro su una tabella, ma questo avviene in concerto con gli altri "adapter" collegati ad altre tabelle, anche perché altrimenti l'integrità referenziale sul database di destinazione non potrebbe essere garantita o potrebbe scatenare degli errori.

    Leggi ad esempio questa pagina e quelle dello stesso capitolo per approfondire il funzionamento nel dettaglio con diversi scenari.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #15
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110
    Ora leggo tutto!
    Non si potrebbe avere un piccolo esempio per capire meglio? Tenendo conto che io uso il designer e non credo dataset "a runtime".

    Se non è troppo complicato ovviamente!
    Grazie ancora

  6. #16
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110
    Quote Originariamente inviata da alka Visualizza il messaggio
    Come da documentazione, il TableAdapter utilizza le relazioni e si occupa di aggiornare anche le tabelle correlate.

    Si tratta di un oggetto che coordina il lavoro su una tabella, ma questo avviene in concerto con gli altri "adapter" collegati ad altre tabelle, anche perché altrimenti l'integrità referenziale sul database di destinazione non potrebbe essere garantita o potrebbe scatenare degli errori.

    Leggi ad esempio questa pagina e quelle dello stesso capitolo per approfondire il funzionamento nel dettaglio con diversi scenari.

    Ciao!
    Ok ho letto ed eseguito scrupolosamente le istruzioni ed in effetti così funziona...
    Se però replico nel mio progetto dove il caso vuole però che io non usi le automatizzazioni al 100% come in questo articolo non funge più...quindi a sto punto forse sbaglio il metodo di binding...o popolamento...o non lo so

    Vi dico esattamente cosa faccio:
    • Creo un dataset nel designer semplicemente trascinando le tabelle dalla finestra Server Explore
    • Il designer mi crea una relazione tra le datatable (pescandola dal DB), io la edito inserendo i vincoli di chiave esterna, i Cascade ecc ecc
    • inserisco un'istanza del dataset (in modalità progettazione) trascinandola dalla casella degli strumenti
    • inserisco un'istanza del tableAdapterManager allo stesso modo
    • inserisco 2 datagridview allo stesso modo
    • inserisco 2 bindingsource allo stesso modo
    • collego i BindingSource all'istanza del Dataset e alla rispettiva tabella (datasource e datamember)
    • collego la fonte dati delle 2 dgview ai rispettivi binding
    • aggiungo 2 bottoni al form

    Il design è completo!
    Passiamo ad un'esempio di inserimento ed update

    Per aggiungere una riga nell tab padre e 2 collegate nella tab figlio:

    codice:
    'ds1 è ovviamente il nome dell'istanza del dataset che ho trascinato sul form
    Dim r as ds.tabPadreRow=ds1.tabPadre.newTabPadreRow
    r.campo1="Ciao"
    r.campo2="Sono Veronica"
    ds1.tabPadre.rows.addTabPadreRow(r)
    
    dim f as ds.tabFiglioRow=ds1.tabFiglio.newTabFiglioRow
    f.campo1="Riciao"
    f.idTabPadre=r.campoID
    ds1.tabFiglio.rows.addTabFiglioRow(f)
    questo è tutto!

    Se provo ad aggiornare con:

    codice:
    miaIstanzaTableAdapterManager.updateAll(ds1)
    idem se uso in serie i singoli tableadapter non usando il tableAdapterManager con:

    codice:
    myTaTabPadre.update(ds1.tabPadre)
    myTaTabFiglio.update(ds1.tabFiglio)
    in quest'ultimo caso ho verificato (come già scritto) che succede perchè già il primo update (tabPadre) marca anche le righe di tabFiglio (non so perchè) come unchanged

    Quindi ancora una volta mi aggiorna la tab padre (nel DB) ma non la tab figlio...
    Inoltre non mi allinea nemmeno gli id (che sul Database a volte sono diversi essendo autoincrement)...

    Cosa sbaglio nel fare ciò che faccio? Grazie...sto iniziando a perdere la speranza
    Ultima modifica di Veronica80; 11-09-2018 a 21:14

  7. #17
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Quindi ancora una volta mi aggiorna la tab padre (nel DB) ma non la tab figlio...
    Inoltre non mi allinea nemmeno gli id (che sul Database a volte sono diversi essendo autoincrement)...
    Siccome gli ID sono auto-incrementali e gestiti dal database, l'errore potrebbe essere proprio in questo frangente: attribuire un valore a questi campi.

    Magari l'Adapter si trova a salvare un primo campo con un ID auto-assegnato, mentre il secondo prova a inserirlo con quello che hai indicato tu (invece che con quello generato lato DB) e in questo modo non riesce a stabilire la giusta correlazione, facendo fallire l'operazione di Update.

    Prova ad approfondire ad esempio lo scenario descritto in questo articolo, che sembra molto simile al tuo e probabilmente contiene la soluzione definitiva (speriamo).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #18
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110
    Grazie ancora Alka...purtroppo non riesco a risolvere...
    Vorrei sottolineare ancora una volta che il motivo per il quale l'update della tabella figlio fallisce è che le datarow vengono marcate come unchanged nell'operazione di update della tabella padre.

    Tant'è che non ricevo nessuna eccezione ma solo il mancato trasferimento dei dati della tabella figlio (che l'adapter non legge come da aggiornare sul db essendo marcati come unchanged...)

    Nel dataset gli id li vedo e son correlati bene (il mio codice inserisce l'id corretto della riga padre in quella figlio ma è corretto per il dataset mentre differisce da quello del DB) il tutto potrebbe essere risolto con un nuovo fill() delle tabelle (che pescherebbe gli id corretti dal db) ma come ti ho detto la mole di dati è grande ed ogni fill() ruba dai 4 ai 5 secondi...quindi vorrei evitare...

    Non credo che lo scenario del tuo ultimo link sia simile al mio...magari son solo talmente cotta che ormai sto dando i numeri
    Però mi pare che il modo in cui inserisce l'id padre nella tab figlio sia uguale al mio (solo io non usato il ctype per convertirlo in Integer)

    Stiamo parlando di operazioni basilari...INSERT, UPDATE ecc e mi sembra davvero pazzesco che il dataset non le gestisca nel modo corretto...

    Sto iniziando a pensare di fare tutto io a mano creando stringhe sql da sola e lanciandole con un command...anche se non è l'ideale perchè in caso di errore mi viene complicato fare un rollback a mano...
    Ultima modifica di Veronica80; 12-09-2018 a 01:31

  9. #19
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Nel dataset gli id li vedo e son correlati bene (il mio codice inserisce l'id corretto della riga padre in quella figlio ma è corretto per il dataset mentre differisce da quello del DB)
    E' proprio questo che mi preoccupa: non vorrei che l'update tentasse di usare l'ID che hai inserito nel record della tabella figlio, al posto di quello che dovrebbe realmente usare e che scopre solo e soltanto nel momento in cui viene inserito il record padre su DB.

    In breve, tu inserisci ID=1 per il record padre e lo correli con lo stesso valore sul record figlio... magari su DB il record padre finisce con l'avere ID=5, ma il record figlio continua a essere inserito facendo riferimento all'ID=1 per il padre, mentre dovrebbe usare il 5.

    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Non credo che lo scenario del tuo ultimo link sia simile al mio...
    Strano, mi sembrava un contesto master/detail come il tuo.
    Nell'esempio, gli ID non vengono inseriti, ma si usa come valore il -1.

    Un altro possibile errore potrebbe annidarsi nella configurazione della relazione.

    In breve, mi pare strano che il DataSet globalmente utilizzato abbia questi problemi insormontabili, ma forse il tuo scenario supera la complessità di base del sistema e sarebbe meglio implementato usando degli oggetti e un framework ORM alternativo, tipo Entity Framework o affini, che ti consentirebbe di lavorare (ed eseguire il "binding") direttamente su oggetto, prescindendo dalla rappresentazione su DB, e appoggiarti alle funzionalità offerte dal framework specifico per eseguire la persistenza su database, con la gestione automatica di autoincrementali e altri punti legati specificatamente allo storage nel suddetto database, tenendo questa parte slegata dalla logica applicativa vera e propria.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #20
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,110
    Intanto grazie ancora per la tua infinita pazienza!

    Quote Originariamente inviata da alka Visualizza il messaggio
    E' proprio questo che mi preoccupa: non vorrei che l'update tentasse di usare l'ID che hai inserito nel record della tabella figlio, al posto di quello che dovrebbe realmente usare e che scopre solo e soltanto nel momento in cui viene inserito il record padre su DB.

    In breve, tu inserisci ID=1 per il record padre e lo correli con lo stesso valore sul record figlio... magari su DB il record padre finisce con l'avere ID=5, ma il record figlio continua a essere inserito facendo riferimento all'ID=1 per il padre, mentre dovrebbe usare il 5.
    No il mio problema era (uso il passato perchè oggi lo ho risolto finalmente ed ora ti dico come) che il primo update marcava come unchanged tutte le righe delle altre tabelle senza però prima spostarle sul databse. In sostanza eseguiva un acceptChanges() globale dopo l'effettivo trasferimento su DB dei dati della tab padre escludendo quindi dall'update tutto il resto!

    Ecco questo l'ho risolto oggi con:
    codice:
     miaTabAdapter.Adapter.AcceptChangesDuringUpdate = False
    Ed ora si che mi trovo nella situazione che hai descritto tu in questo quote!

    Ho letto 2 volte il tuo link ma sincermante non ho capito granchè
    Anche perchè con l'inglese ho qualche limite

    Ora però riprovo a mente più riposata e ti dico! Se nel frattempo trovi qualche cosa in italiano fammi un fischio!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.