Utilizzo base di Gambas e Sqlite3

Da Gambas-it.org - Wikipedia.

Gambas e Sqlite

(pagina a cura di Fea Sergio - f.surfing@tiscali.it)


Questo piccolo articolo vuole essere una semplice guida all'utilizzo base di Gambas e Sqlite3, rivolto a chi effettua i primi passi con questo linguaggio di programmazione ed ha necessità di realizzare un applicazione stand-alone che debba immagazzinare una certa quantità di dati in db.

Creazione di un database

Il primo passo che dovremo realizzare sarà appunto creare un database adatto alle nostre esigenze, per far ciò utilizziamo la classe connection del componente gb.db.

Questa classe ha bisogno di alcuni parametri che andremo a fornirgli in questo modo:

 Dim sName AS String   ' sName è una variabile che indica il nome che diamo al nostro database
 Dim sPercorso as String   ' indica il percorso in cui andremo a creare il db
 Dim$hConn as NEW Connection
 
 sName=”prova”
 sPercorso=user.home      ' definiamo come percorso la nostra home
 
 With $hConn
   .Type = "sqlite3"   ' indicazione del tipo di database da utilizzare
   .Host = sPercorso
   .Login = ""
   .Password = ""
 End With

a questo punto possiamo procedere alla creazione verificando però che il db non sia già presente altrimenti visualizzeremo una finestra di errore:

 $hConn.Open
 
 If Not $hConn.Databases.Exist(sName) Then   ' verifica che il db non esista
   $hConn.Databases.Add(sName)
' crea il nostro db
 Else
   Message.Error("database già esistente", "OK")
 Endif
 
 $hConn.Close

Così abbiamo creato il nostro db ma non ha ancora nessuna tabella all' interno e quindi è inutilizzabile, per realizzare la struttura possiamo utilizzare la funzione .tablefields.add oppure sfruttare un query SQL .

Considerando la seconda ipotesi e volendo creare una tabella di nome "biblio" con dei dati biografici quali:

nome
cognome
indirizzo

procederemo con una query di questo tipo:

sql = "CREATE TABLE 'biblio' ( 'id' INTEGER PRIMARY KEY AUTOINCREMENTAL, 'nome' VARCHAR(255) DEFAULT NULL, 'cognome' VARCHAR(255) DEFAULT NULL, 'indirizzo' VARCHAR(255) DEFAULT NULL);"

il tutto scritto in un unica riga.

Si noti il campo “id” che contiene l' indice del database ed è di tipo integer autoincrementante (ovvero ogni volta che inseriamo un record il rispettivo id verrà inserito automaticamente.

Tutti gli altri campi io per abitudine li creo di tipo testo con lunghezza 255 caratteri.


Quindi il nostro codice per la creazione del db sarà cosi modificato:

Public Sub Button1_Click()

 Dim sName As String   ' sName è una variabile che indica il nome che diamo al nostro database
 Dim sPercorso As String   ' indica il percorso in cui andremo a creare il db
 Dim $hConn As New Connection
 Dim sql As String
 Dim htable As Result
 
 sName = "prova"
 sPercorso = User.Home   ' definiamo come percorso la nostra home
 
 With $hConn
   .Type = "sqlite3"   ' indicazione del tipo di database da utilizzare
   .Host = sPercorso
   '".Login = ""
   ' .Password = ""
 End With
 
 $hConn.Open
 
 If Not $hConn.Databases.Exist(sName) Then   ' verifica che il db non esista
   $hConn.Databases.Add(sName)   ' crea il nostro db
   $hConn.Close   ' chiude il db
   $hConn.Name = sName
   $hConn.Open()   ' riapre il db per l' aggiunta della tabella
   
' scrivere la query su un unica riga oppure separarla con i separatori &
   sql = "CREATE TABLE 'biblio' ( 'id' INTEGER PRIMARY KEY, 'nome' VARCHAR(255) DEFAULT NULL, 'cognome' VARCHAR(255) DEFAULT NULL, 'indirizzo' VARCHAR(255) DEFAULT NULL);"
 
   hTable = $hConn.EXEC(sql)
 
   $hConn.Commit
   Label1.Text = "Database creato"
 Else
   Message.Error("database già esistente", "OK")
 Endif
 
 $hConn.Close
 
End

Aggiunta di un record

Ora che abbiamo un bel db nuovo fiammante dobbiamo inserire i dati all' interno, supponiamo di inserire i dati richiesti in 3 textbox e di effettuare la memorizzazione con un pulsante, il nostro codice sarà:

Public Sub Button2_Click()

 Dim sName As String ' sName è una variabile che indica il nome che diamo al nostro database
 Dim sPercorso As String ' indica il percorso in cui andremo a creare il db
 Dim $hConn As New Connection
 Dim hres As Result
 Dim sql As String
 
' controllo dati inseriti
 'sData = TextBox4.Text
 
 If TextBox1.Text = "" Or TextBox2.text = "" Or TextBox3.text = "" Or TextBox4.text = "" Then
' controllo che siano inseriti dei valori nei campi richiesti
   Message.Error("Completare tutti i campi", "OK")
 Else
   sName = "prova"
 
   sPercorso = User.Home   ' definiamo come percorso la nostra home
 
   With $hConn
     .Type = "sqlite3"   ' indicazione del tipo di database da utilizzare
     .Host = sPercorso
     '''.Login = ""
     ' .Password = ""
   End With
   
   $hConn.Name = sName
   $hConn.Open
 
   $hconn.Begin
   
   hres = $hconn.Create("biblio")   ' collega il result hres alla tavola prova in modalità creazione record
 
   hres!nome = TextBox1.Text   ' scrittura dei vari campi del record
   hres!cognome = TextBox2.Text
   hres!indirizzo = TextBox3.Text
   
   hres.Update
 
   $hConn.Commit
   $hConn.Close
 
   textbox1.text=""
   textbox2.text=""
   textbox3.text=""
   label1.text = "aggiunta record effettuata"
 Endif
 
End

Ricerca dati

la ricerca dati sarà probabilmente l' operazione che verrà compiuta maggiormente in un db in quanto necessaria in altre operazioni come la modifica di un record o la cancellazione , in questo esempio effettueremo una ricerca per nome e visualizzeremo i dati in una GridView.

Aggiungiamo quindi al nostro form un textbox4 dove scriveremo il testo da ricercare ed una gridview.

Nella funzione TextBox4_Change( ) inseriremo il codice per effettuare la ricerca, in questo modo scrivendo la parola da ricercare verranno visualizzate tutte le corrispondenze.

Logicamente prima di fare una ricerca dovremo aver inserito dei dati all' interno del db!

Come prima cosa dovremo collegarci al db tramite il solito metodo , una volta "connessi" per effettuare una ricerca utilizzeremo il metodo connection.Exec fornendogli una query SQL per la ricerca.

A seconda di ciò che vogliamo cercare useremo query diverse, nel nostro caso dobbiamo utilizzare una query che ricerchi nella colonna nome tutti i record che contengono il testo contenuto in textbox4:

sql = "SELECT * FROM biblio WHERE nome LIKE '%" & textbox4.Text & "%'"

I caratteri % indicano un qualsiasi valore (carattere jolly).

quindi daremo la query in pasto al db:

hres = $hconn.Exec(sql)

Nel result "hres" sono presenti tutti i record che soddisfano la nostra ricerca, ora dobbiamo visualizzarli nella gridview , possiamo farlo con un ciclo FOR EACH su hres:

 For Each hres
   GridView1[i, 0].Text = hres!id
   GridView1[i, 1].Text = hres!nome
   GridView1[i, 2].Text = hres!cognome
   GridView1[i, 3].Text = hres!indirizzo
   i = i + 1
 Next

Il primo valore nelle parentesi quadre indica il numero del record su cui scrivere ed il secondo il numero di colonna, i dati da estrapolare si indicano scrivendo il nome del result seguito da un punto esclamativo seguito dal nome del campo del db.

Oppure si puo utilizzare questo tipo di codice :

 For Each hres
   GridView1[i, 0].Text = hres[0]
   GridView1[i, 1].Text = hres[1]
   GridView1[i, 2].Text = hres[2]
   GridView1[i, 3].Text = hres[3]
   i = i + 1
 Next
Et voilà , mentre digitiamo una parola nel campo ricerca la gridview ci visualizzerà tutte le rispondenze, il codice completo della funzione sarà il seguente:
Public Sub TextBox4_Change()

 Dim sName As Strings   ' Name è una variabile che indica il nome che diamo al nostro database
 Dim sPercorso As String   ' indica il percorso in cui andremo a creare il db
 Dim $hConn As New Connection
 Dim hres As Result
 Dim sql As String
 Dim i As Integer
 
 GridView1.Clear
 sName = "prova"
 sPercorso = User.Home   ' definiamo come percorso la nostra home
 
 With $hConn
   .Type = "sqlite3"   ' indicazione del tipo di database da utilizzare
   .Host = sPercorso
   '.Login = ""
   ' .Password = ""
 End With
 
 $hConn.Name = sName
 $hConn.Open
 
 sql = "SELECT * FROM biblio WHERE nome LIKE '%" & textbox4.Text & "%'"
' sql di ricerca segue questa sintassi:
' SELECT * FROM nome_tavola WHERE nome_colonna LIKE '%valore_da_cercare%' 
 hres = $hconn.Exec(sql)
 
' esegue la query
 If hres.Available = True Then
' controlla se la query ha dato dei risultati in caso affermativo procede alla visualizzazione, altrimenti visualizza messaggio di errore
   GridView1.Mode = Select.Multiple
   GridView1.Columns.Count = 4
' imposta il numero di colonne della GridView1
   GridView1.Rows.Count = hres.Count   ' imposta il numero di record in base al numero di risultati presenti
   i = 0
   For Each hres
' inizio del ciclo
     GridView1[i, 0].Text = hres!id
     GridView1[i, 1].Text = hres!nome
     GridView1[i, 2].Text = hres!cognome
     GridView1[i, 3].Text = hres!indirizzo   ' scrive il 1° valore nella griglia
     Inc i   ' aumenta di uno la variabile "i"; in tal modo al prossimo ciclo si scriverà il record successivo
   Next
 Else   ' nel caso hres non contenga risultati
   GridView1.Columns.Count = 1
   GridView1.Rows.Count = 1
   GridView1[0, 0].Text = "Nessun dato"   ' viene visualizzata la scritta "nessun dato"
 Endif
 
End

Modifica di un record

Questa operazione si effettua tramite il metodo connection.edit che richiede come parametri il nome della tavola e il criterio di ricerca.

Solitamente come criterio si può utilizzare l' indice del db che essendo univoco ci permette di posizionarci esattamente nel record richiesto:

hres = $hConn.edit("biblio", "id=" & id)

A questo punto modifichiamo i valori che ci interessano con:

hres!nome = TextBox1.Text
hres!cognome = TextBox2.Text
hres!indirizzo = TextBox3.Text

hres.Update

Il codice del nostro programmino sarà:

Public Sub GridView1_Click()

 Dim iRow As String
 Dim id As String
 Dim sName As String   ' sName è una variabile che indica il nome che diamo al nostro database
 Dim sPercorso As String   ' indica il percorso in cui andremo a creare il db
 Dim $hConn As New Connection
 Dim hres As Result
 Dim sql As String
 Dim i As Integer
 
 sName = "prova"
 sPercorso = User.Home   ' definiamo come percorso la nostra home
 
 With $hConn
   .Type = "sqlite3"   ' indicazione del tipo di database da utilizzare
   .Host = sPercorso
   '".Login = ""
   ' .Password = ""
 End With
 
 $hConn.Name = sName
 $hConn.Open
 
 iRow = GridView1.Row
 
 sql = "SELECT * FROM biblio WHERE nome LIKE '%" & textbox4.Text & "%'"
 
 hres = $hconn.Exec(sql)   ' esegue la query
 
 If iRow <> -1 Then
   hres.MoveTo(iRow)
   id = hres!id
   hres = $hConn.edit("biblio", "id=" & id)
   TextBox1.Text = hres!nome
   TextBox2.Text = hres!cognome
   TextBox3.Text = hres!indirizzo
   Label6.Text = id
   Button2.Enabled = False
   Button3.Enabled = True
   Button4.Enabled = True
 Endif
 
 $hConn.Close
 
End


Public Sub Button3_Click()

 Dim id As String
 Dim sName As String ' sName è una variabile che indica il nome che diamo al nostro database
 Dim sPercorso As String ' indica il percorso in cui andremo a creare il db
 Dim $hConn As New Connection
 Dim hres As Result
 Dim sql As String
 
 sName = "prova"
 sPercorso = User.Home 'definiamo come percorso la nostra home
 
 With $hConn
   .Type = "sqlite3" ' indicazione del tipo di database da utilizzare
   .Host = sPercorso
   '".Login = ""
   ' .Password = ""
 End With
 
 $hConn.Name = sName
 $hConn.Open
 
 id = Label6.Text
 hres = $hConn.edit("biblio", "id=" & id)
 hres!nome = TextBox1.Text
 hres!cognome = TextBox2.Text
 hres!indirizzo = TextBox3.Text
 hres.Update
 Button3.Enabled = False
 Button4.Enabled = False
 Button2.Enabled = True
 $hconn.Commit
 TextBox1.Text = ""
 TextBox2.Text = ""
 TextBox3.Text = ""
 textbox4.Text = ""
 $hConn.Close
 
End

Cancellazione di un record

La cancellazione si effettua in modo simile alla modifica , si utilizza lo stesso metodo Connection.edit:

Public Sub Button4_Click()

 Dim id As String
 Dim sName As String ' sName è una variabile che indica il nome che diamo al nostro database
 Dim sPercorso As String ' indica il percorso in cui andremo a creare il db
 Dim $hConn As New Connection
 Dim hres As Result
 Dim sql As String
 
 sName = "prova"
 sPercorso = User.Home   ' definiamo come percorso la nostra home
 
 With $hConn
   .Type = "sqlite3"   ' indicazione del tipo di database da utilizzare
   .Host = sPercorso
   '".Login = ""
   ' .Password = ""
 End With
 
 $hConn.Name = sName
 $hConn.Open
 
 id = Label6.Text
 hres = $hConn.edit("biblio", "id=" & id)
 hres.Delete
 Button3.Enabled = False
 Button4.Enabled = False
 Button2.Enabled = True
 $hconn.Commit
 TextBox1.Text = ""
 TextBox2.Text = ""
 TextBox3.Text = ""
 Textbox4.Text = ""
 
 $hConn.Close
 
End