Autore Topic: Sqlite e Gambas  (Letto 5115 volte)

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.255
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Sqlite e Gambas
« il: 03 Febbraio 2008, 10:19:20 »
Ieri è stata una giornata importante, ho capito che Gambas gestisce sqlite in modo diverso da altri software, esempio sqlitestudio. Infatti x creare e modificare un database avevo usato questo software. E andando a creare delle routine x avere in automatica dati sul campi delle tabelle mi sono accorto che sqlitestudio crea e gestisce la tabella sqlite_master in maniera diversa: ad esempio sqlitestudio inserisce i nomi dei campi tra parentesi quadre, gambasdatabase tra apici. Questa differenza è importante se si usa codice per fare il parsing delle informazioni presenti nella tabella.

Per cui da oggi database fatti esclusivamente con Gambas, che tra parentesi gestisce tutte le versioni di sqlite.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Sqlite e Gambas
« Risposta #1 il: 03 Febbraio 2008, 10:53:37 »
Ti consiglio un ottimo frontend, Knoda.
In genere è presente nei repo di quasi tutte le distro.
Si connette a diversi DB quali MySQL, Postgre e SQLite.
Io lo uso per creare e modificare semplicemente le tabelle dei miei DB, veramente comodo.

P.S.:
non so se ti possono tornare utili questi frammenti di codice per capire come usare le query SQL con gli oggetti Connection e Result.
Con questo salvi dei dati in una tabella:

Codice: [Seleziona]
PRIVATE SUB Salva_dati()
DIM Connessione AS NEW Connection
DIM Risultato AS Result

  '-- connetti al database
  Connessione.Name = Application.Path & "/archivio"
  Connessione.Type = "sqlite3"
  Connessione.OPEN

  '-- scelta della tabella
  Risultato = Connessione.Edit("codici", "tipo = &1", comodo)
  Risultato["nome_campo"] = Nuovovalore '-- inserimento valore nel campo
  (...)
  Risultato.Update  '-- istruzione di aggiornamento
  Connessione.Commit  '-- forza il database ad eseguire
  '-- tutte le operazioni pendenti
  Connessione.CLOSE '-- chiusura
END


Creazione di una nuova scheda anagrafica:

Codice: [Seleziona]

PRIVATE SUB Crea_dati()
DIM Connessione AS NEW Connection
DIM Risultato AS Result

  '-- connetti al database
  Connessione.Name = Application.Path & "/archivio"
  Connessione.Type = "sqlite3"
  Connessione.OPEN

  '-- salvataggio nuovo contatto
  Risultato = Connessione.Create("anagrafica")
  Risultato["codice"] = codice
  Risultato["cognome"] = txtCognome.Text
  Risultato["nome"] = txtNome.Text
  Risultato["indirizzo"] = txtIndirizzoNom.Text
  Risultato["citta"] = txtCapNom.Text
  Risultato.Update
  Connessione.Commit
  Connessione.CLOSE
END


Cerchi qualcosa? Ecco il codice:

Codice: [Seleziona]

(...)
  Connessione.Name = Application.Path & "/archivio"
  Connessione.Type = "sqlite3"
  Connessione.OPEN
  Risultato = Connessione.Find("anagrafica", "codice = &1", Codice)
  IF Risultato.Available = FALSE THEN
    Message.Info("Nessun dato trovato")
    RETURN
  ENDIF
(...)


Trova nella tabella "anagrafica" il contatto con il codice uguale a
Codice. Il database SQLite3 lo puoi creare o da console di SQLite oppure
usando ad esembio Knoda, un front-end grafico per diversi tipi di database.[/code]
Visita il mio sito personale: http://www.leonardomiliani.com

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.255
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Sqlite e Gambas
« Risposta #2 il: 03 Febbraio 2008, 13:01:01 »
grazie per il codice, me lo guardo...io accedo al database con una piccola classe da me creata e poi eseguo tutte le operazioni variando esclusivamente la sql (di inserimento/eliminazione/modifica...)...ecco la classe:

Codice: [Seleziona]

PUBLIC conn AS NEW Connection
PUBLIC connesso AS Boolean

PUBLIC SUB _new(OPTIONAL mytype AS String, OPTIONAL myhost AS String, OPTIONAL mydb AS String, OPTIONAL myuserid AS String, OPTIONAL mypassword AS String)
  IF (connesso = FALSE) THEN
    WITH conn
      .type = mytype
      .host = myhost
      .login = myuserid
      .password = mypassword    
      .name = mydb
    END WITH    
    TRY conn.Open  
    IF ERROR THEN    
      message("Non posso aprire il database. Errore " & Error.Text)  
    END IF  
    connesso = TRUE
  END IF  
END

PUBLIC FUNCTION EseguiSql(mysql AS String) AS Result
 'LETTURA TABELLA MyResult = MySqlite.EseguiSql("select * FROM test")
 'NUOVO RECORD MyResult = MySqlite.EseguiSql("INSERT into test (id) values (555)"  
 'AGGIORNO RECORD MyResult = MySqlite.EseguiSql("UPDATE test valore1=12 WHERE id=1")
  RETURN conn.Exec(mysql)    
END


knoda lo conoscomi piace anke se sembra che ultimamente non è stato molto sviluppato. Diro' una cosa 'eretica' ma con virtualbox uso sqlitemaestro che permette di fare query visuali stile access... a dire il vero mi piacerebbe creare il clone di Access con gambas...manca un programma database di livello.
Pensa ad un database con la qualità di interfaccia di pgDesigner.

ciao

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Sqlite e Gambas
« Risposta #3 il: 03 Febbraio 2008, 15:04:24 »
Il tuo codice è molto più pulito, rispetto al mio....  :oops:

Cmq, interessante applicazione sarebbe quella da te proposta :-)
Visita il mio sito personale: http://www.leonardomiliani.com

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.255
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Sqlite e Gambas
« Risposta #4 il: 03 Febbraio 2008, 18:21:49 »
Access clone, ho già il nome, che sa di presa per i fondelli, ma suona proprio bene: GACCESS..

Se vogliamo unire le forze sono a disposizione. Knoda, Kexi, Rekall mi sembrano fermi o sbaglio. L'occasione x diventare un punto di riferimento c'è.

Scusa l'avevo tralasciata , ecco un esempio pratico di applicazione della mia classe:

Codice: [Seleziona]
MySqlite AS dbConnection 'istanza della classe dbConnection
MyResult AS Result 'risultato della query tipicamente un recordset

PUBLIC SUB Form_Open()
MySqlite = NEW dbConnection("sqlite3", "", "diet.db", "", "") 'connessione
END SUB

PUBLIC SUB CaricaAlimenti()
  DIM counter AS Integer
  MyResult = MySqlite.EseguiSql("SELECT idalimento, alimento FROM tbALIMENTI ORDER BY alimento ASC")  
  MyResult.movefirst
  lstALIMENTI.Clear
  counter = 0
  FOR EACH MyResult
    counter = counter + 1
    lstALIMENTI.Add(MyResult!alimento)
  NEXT
END


come vedi è di una semplicità estrema. Mia intenzione è migliorare ulteriormente la classe, con una routine che automatizzi la creazione delle sql, cosa interessante soprattutto quando i campi delle tabelle sono numerosi. Che ne pensi?

ATTENZIONE

Una cosa che per ora non riesco a risolvere direttamente è l'attribuzione del valore aggiunto alla listbox. Mentre col VB è possibile aggiungere alla list box un valore comprensivo anche della suo valore di chiave (id), mi sembra che questo non sia possibile con gambas, il controllo listbox permette l'inserimento di un valore stringa e di un indice che risulta essere la posizione nella listbox , non certo l'id (nel caso sopra mi riferisco al valore di idalimento).

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Sqlite e Gambas
« Risposta #5 il: 04 Febbraio 2008, 12:14:44 »
In questi giorni devo terminare un lavoretto web per cui di tempo a disposizione non ne ho moltissimo.
Lieto però di darti una mano non appena mi libero  :good:
Visita il mio sito personale: http://www.leonardomiliani.com

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.255
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Sqlite e Gambas
« Risposta #6 il: 04 Febbraio 2008, 19:37:53 »
idem x me....rubero' sonno alla programmazione, ma mi stimola molto gambas..