Autore Topic: connessione al DB  (Letto 1306 volte)

g.paolo

  • Visitatore
connessione al DB
« il: 25 Febbraio 2008, 18:52:20 »
Nei vari esempi riportati in questo forum ho notato che la connessione al DB viene sempre ripetuta ad ogni operazione di lettura o scrittura.
Mi chiedevo se questo è proprio necessario, perchè mi parrebbe più logico aprire la connessione una tantum all'apertura dell'applicativo, e chiuderla solo alla fine di tutte le attività.
Il problema mi si è presentato nel momento in cui, dopo aver aperto il DB in sola lettura con un comando:

read_data = fmain.connessione.Exec(fmain.com_select)

dove la variabile fmain.com_select contiene il comando SQL che uso per aprire qualsiasi table o query ed è dichiarata solo nel Fmain, ho cercato di impostare la fase di scrittura senza chiudere e riaprire la connessione, usando allo scopo il solo comando:

write_data = fmain.connessione.edit(fmain.com_select)

Il risultato è stato di ottenere il seguente errore:
"SQL error or missing database"

Mi sapete consigliare in merito? Grazie!

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: connessione al DB
« Risposta #1 il: 25 Febbraio 2008, 20:12:32 »
No, se ti mantieni l'oggetto connessione dovresti poter fare qualunque cosa.

Dalle poche note che hai scritto non si capisce se hai un oggetto all'interno della form, oppure hai creato una classe pubblica esterna.

Il mio consiglio è di farti una bella classe (o oggetto), che mantiene attiva la connessione, con metodi del tipo: open() e close(), e magari qualche altro che ti permette di eseguire query e ritornarti i risultati. Dopo di che la chiami dall'applicazione, se vuoi, e rendi questa classe pubblica nell'applicazione stessa, in modo che tutti i moduli del programma vi possano accedere. Alla chiusura dell'applicazione chiudi anche la connessione, e il gioco e fatto.

Tutto ciò è un esempio, se vuoi puoi associare questa classe ad un gruppo particolare di moduli (quelli che accedono al db), e usare solo lì questo oggetto.

Ciao

g.paolo

  • Visitatore
Re: connessione al DB
« Risposta #2 il: 25 Febbraio 2008, 20:34:49 »
Ho creato l'oggetto connessione nella classe d'inizio come "static public", ed una volta aperto lo uso da qualsiasi modulo o form, senza problemi.

STATIC PUBLIC connessione AS NEW Connection 'memorizza il file di DB
STATIC PUBLIC com_select AS String         'memorizza il comando SELECT richiesto
STATIC PUBLIC percorso AS String           'cartella contenente il programma
STATIC PUBLIC hform AS Flist               'memorizza un'istanza del form Flist

PUBLIC SUB Form_Open()                    'apre il form principale
    ME.Move(50, 50)
    percorso = Application.Path           'ritorna la posizione del programma
    btnlog.Enabled = TRUE
    funzioni.apre_database
END

PUBLIC SUB btnclose_Click()               'chiude il programma
    FMain.Close
END

PUBLIC SUB Form_Close()                   'chiude la connessione
    connessione.Close
END

' nel modulo "funzioni"
PUBLIC SUB apre_database()            'apre la connessione al database sqlite3
  DIM cartella AS String
  cartella = "/home/han/database_prova/"       'cartella contenente il database
  WITH FMain.connessione        ' la variabile connessione è dichiarata in Fmain!
    .Type = "sqlite3"                         'il tipo di DB
    .Name = cartella & "3M.kexy"       'posizione e nome del file di database
    .Open                              'apre la connessione al DB
  END WITH
END

Non credo che cio influisca sul modo di fare le varie query. Fino ad ora le ho sempre fatte in sola lettura, ed il problema mi si presenta solo ora che desidero andare a modificare i dati.
Comunque ho capito dalla tua risposta che il problema non sta in questo, ma lo devo cercare altrove. Grazie.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: connessione al DB
« Risposta #3 il: 26 Febbraio 2008, 07:07:06 »
La questione secondo me riguarda 2 campi: l'ottimizzazione del codice ed il modus operandi personale.
Se guardiamo dal lato dell'ottimizzazione del codice la questione, allora è sicuramente indicato aprire la connessione all'avvio dell'applicazione e chiuderla solo all'uscita dalla stessa.

Io però preferisco aprirla e chiuderla solo quando devo accedere al DB per la scrittura del dati. Questo per un motivo molto semplice: bisogna tener conto di problematiche legate alla sicurezza dei dati.
Immaginiamo un programma che gestisce una grossa mole di dati. Se durante una sessione dello stesso, cadesse la tensione e si spengesse ogni cosa?
Potrei perdere qualcosa, rimasto nella cache del filesystem prima della scrittura fisica sul disco.

Ecco perché io preferisco sempre aprire il DB solo quando devo scriverci effettivamente e consiglio sempre un bel Commit() prima di chiudere la connessione per forzare l'esecuzione di tutte le operazioni rimaste in sospeso nella cache del DB stesso.
Visita il mio sito personale: http://www.leonardomiliani.com

g.paolo

  • Visitatore
Re: connessione al DB
« Risposta #4 il: 26 Febbraio 2008, 08:04:23 »
E' molto vero quello che dici e ritenevo di aver pensato nel giusto modo forzando la scrittura dei dati ad ogni transazione mediante il comando: connessione.commit.
Il fatto poi di tener aperta la connessione non dovrebbe, dico dovrebbe ,pregiudicare la sicurezza dei dati, o sbaglio?

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: connessione al DB
« Risposta #5 il: 26 Febbraio 2008, 12:22:13 »
Il problema risiede nella cache del filesystem.
Dipende da quante operazioni ha da eseguire: se ha solo le tue, ci sta che anche eseguendo Commit i dati non vengano fisicamente scritti.

Si potrebbe forzarne la scrittura eseguendo in un terminale "sync" però bisognerebbe avere i privilegi di root, e questo non è bello dal punto di vista della sicurezza.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: connessione al DB
« Risposta #6 il: 26 Febbraio 2008, 16:34:54 »
A parte il discorso di aiuto iniziale, sono pienamente d'accordo con te leo... per avere un buco nella sicurezza basta poco, e chi lo sfrutta ha tutti gli strumenti per individuarlo, per cui l'approccio apri-chiudi è sicuramente il più sicuro.

A livello teorico gli approcci su come affrontare una struttura applicativa dipende molto dalle idee ed esperienza personali, ma anche dal contesto in cui viene sviluppata. A volte scelte ovvie vengono sconvolte da logiche imposte, per cui le buone idee le butti al secchio.

Bye

g.paolo

  • Visitatore
Re: connessione al DB
« Risposta #7 il: 26 Febbraio 2008, 17:01:03 »
Bene! Dai vostri ragionamenti capisco dunque che è meglio sempre l'apri-chiudi, quindi farò in modo di usare una funzione apposita da richiamare in fase di apertura ed una seconda in fase di chiusura.