Autore Topic: Gestione journal in fase di prova  (Letto 2150 volte)

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Gestione journal in fase di prova
« il: 11 Settembre 2008, 15:22:46 »
Ehilà!

Ho un dubbietto :)

Sto facendo un progettino che lavora su un DB Sqlite.
Ho verificato che il programma effettua correttamente tutti gli aggiornamenti facendo il test. Quando esco dall'applicazione sembra che le modifiche vengano perdute.
E' possibile che in fase di test l'ambiente di sviluppo mi faccia un rollback quando esco?

Grazie :)
Saluti a tutti

Mario

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Gestione journal in fase di prova
« Risposta #1 il: 11 Settembre 2008, 17:28:03 »
Un bel "COMMIT" l'hai dato ? Tanto per essere sicuri.

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Gestione journal in fase di prova
« Risposta #2 il: 13 Settembre 2008, 17:51:14 »
Sì, sì :)

Codice: [Seleziona]

PUBLIC SUB Button1_Click()
'Chiusura del programma

  db.Commit
  db.Close
  ME.Close

END
Saluti a tutti

Mario

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Gestione journal in fase di prova
« Risposta #3 il: 14 Settembre 2008, 16:56:14 »
Aggiorni il Result dopo ogni operazione di Edit/Create/Delete?
Codice: [Seleziona]
Risultato.Update
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Gestione journal in fase di prova
« Risposta #4 il: 14 Settembre 2008, 18:26:38 »
Ecco la parte di codice interessata...

Codice: [Seleziona]

  'Se il record esiste, lo aggiorno
  IF hInterventi.Available = TRUE
    Int2File(hInterventi)
  END IF
 
  'Se il record non esiste, lo aggiungo
  IF hInterventi.Available = FALSE
    db.Begin
    hInterventi = db.Create("Interventi")
    Int2File(hInterventi)
  END IF

  hInterventi.Update
  db.Commit



Ho notato che durante l'elaborazione viene creato un file che si chiama "NomeDelDataBase.journal" (o qualcosa del genere), e che sparisce quando chiudo il programma... Ho provato a verificare cosa capita quando faccio delle modifiche al DB, ma sul file "originale", anche dopo la commit, la modifica non si vede. Eppure se vado a richiamare lo stesso record lo vedo modificato, come se prendesse i dati da qualche parte temporanea... :o
Saluti a tutti

Mario

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Gestione journal in fase di prova
« Risposta #5 il: 14 Settembre 2008, 19:13:05 »
Il file nomedb.journal contiene le modifiche al DB che il driver SQLite deve ancora trascrivere nel DB stesso. Sparisce quando tali operazioni sono eseguite.

Tornado al tuo programma, ti suggerisco di aprire la connessione solo quando devi eseguire l'operazione e di chiuderla subito dopo, onde esser sicuro che l'operazione venga effettivamente eseguita. Poi, l'Update io nel tuo codice lo metterei nel blocco condizionale, così che venga eseguito solo in concomitanza con il comando Db.Create.
Inoltre, che cos'è quella funzione Int2file? Sei sicuro che non generi qualche errore?
Dalla documentazione di SQLite (http://www.sqlite.org/lang_transaction.html) si legge che:
1) una transazione è avviata automaticamente ad ogni operazione che modifica i dati del DB per cui non ci sarebbe bisogno, con SQLite, di aprire e chiudere una transazione;
2) se si verifica un errore dopo un DB.Begin, l'operazione è rollbackata in automatico per cui nessuna modifica viene scritta.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Gestione journal in fase di prova
« Risposta #6 il: 14 Settembre 2008, 20:53:27 »
Int2File() si limita a spostare i dati dal video al file, c'è anche File2Int, che fa l'operazione contraria. Ho fatto una coppia di funzioni per ogni file interessato. Mi pare che la funzione non ci sia molto da sbagliare, in ogni caso eccola :)

Codice: [Seleziona]

PUBLIC SUB Int2File(hData AS result)
 
  hData!prgKey = KeyInterventi.Text
  hData!dtIntervento = (dtIntervento.value)
  hData!intProgetto = CodiceProgetto(cbProgetti.Text)
  hData!TempoImpiegato = Val(TempoOre.text)
  hData!Note = txDescrizione.Text
  hData!intTrasferta = cbTrasferta.Value
  hData!intTariffa = TariffaUnaTantum.Value
 
  'Se la data di fatturazione non è indicata, ci metto la data intervento
  IF IsNull(dtFatturazione.value) THEN
    hData!dtFatturazione = (dtIntervento.Value)
  ELSE
    hData!dtFatturazione = (dtFatturazione.value)
  END IF
     
END


Come vedi c'è veramente poca roba.
Non sapevo la cosa del rollback automatico, interessante :)
Saluti a tutti

Mario

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Gestione journal in fase di prova
« Risposta #7 il: 14 Settembre 2008, 23:07:24 »
Sinceramente non la sapevo neanch'io ;-)
Ma quando si deve cercare di capire da dove viene un errore inspiegabile bisogna iniziare con il documentarsi su tutto quello che si usa. Così, visto che si parlava di SQLite, la prima cosa che ho fatto è stata quella di andare sul sito degli sviluppatori.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Gestione journal in fase di prova
« Risposta #8 il: 18 Settembre 2008, 08:13:56 »
Può anche darsi che abbia un problema io con il mio Sqlite... purtroppo l'AMD64 del mio scatolino a volte ha qualche antipatia... :)
Saluti a tutti

Mario