Mi riferisco a
questa discussione]http://www.gambas-it.org/smf/index.php?topic=1128.msg12439#msg12439]questa discussione perché non riesco ad usare bene una classe che avevo creato allo scopo di gestire in maniera snella l'avvio di una connessione ad un DB SQLite3, ogni volta che mi serve dentro un programma, senza dovere ripetere le solite 5 o 6 istruzioni, con perdita di tempo e buona possibilità di commettere stupidi errori.
É stato proprio quel post a spingermi a provare e sembrava che ci fossi riuscito; infatti andava tutto bene per la gestione della connessione in lettura, ma ho impegato tutto un pomeriggio per cercare di capire, senza riuscirvi, come mai nella registrazione di due record in una stessa tabella, il primo ci finiva, mentre il secondo non sempre. Per uscire dal guazzabuglio ho abolito la classe che avevo creato ed ho utilizzato una "PUBLIC SUB" dentro la stessa Form.Class, però mi resta l'onere di doverla riprendere ogni volta che mi servirà, invece, se riuscissi ad inserirla in una classe sarebbe tutto molto più semplice.
Ecco cosa avevo preparato:
1) La classe che si occupava dell'apertura della connessione:' Gambas class file
'------------------------------- ApriDB.Class ------------------------------------------------------------------------------------------
PUBLIC DB_Connection AS NEW Connection 'inizializza la nuova connessione
PUBLIC RecTbpiacon AS Result
PRIVATE CONST $_DbNome AS String = "ContabFamdb" 'Nome del Database
PUBLIC SUB _new()
DIM $_DbPath AS String = Application.Path & "/ContabFam_DB" 'Percorso di ricerca del Database ContabFam.db"
'----------------------------------------
WITH
DB_Connection
.Type = "sqlite3"
.Host = $_DbPath
.Name = $_DbNome
.OPEN 'Apro il DB
END WITH
END
2) Nella sezione delle dichiarazione della Form.Class:3)Nella Procedura_Evento di accesso alla tabella da interrogare:DBOpen = NEW ApriDB
DBOpen.RecTbpiacon = DBOpen.DB_Connection.EXEC("SELECT * FROM piancont WHERE NomeVoce = '" & LAST.Text & "'")
IF DBOpen.RecTbpiacon.Available THEN
---------------- bla bla bla ----------------
---------------- bla bla bla ----------------
ENDIF
DBOpen.DB_Connection.Close
4)Nella Procedura_Evento di insertimento righe in tabella: 4.a) La Open e per le interrogazioni e l'inserimento di righe nuove era affidata ad una SUb che veniva richiamata con:
$_Return = InsNuoVoce(i_ComboIns, $_SiNo)
4.b) La "InsNuoVoce" si occupava della Open, di qualche interrogaziione, della Commit finale e della Close della connessione, mentre il lavoro della registrazione vera e propria veniva affidata ad una successiva Function che era richiamata con:
$_Esito = InsVocePiaCont($_NomeVoce, $_SiNo, i_NumCto, i_PassIncr, i_ToVoxNuo)
4.c) La "InsVocePiaCont" svolgeva perciò la registrazione della riga di tabella coi dati che le venivano passati, senza eseguire alcun commit dopo la registrazione.
Purtroppo non posso riproporre il codice perché l'ho ora adattato al nuovo metodo di apertura della connessione.:
Mi rendo conto che é venuto fuori un procedimento un pò ingarbugliato, però penso che aggiustando qualcosa nei collegamenti del DB, qualcosa che non riesco a capire, funzionerà.
Ecco, ma cosa?