Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: g.paolo - 08 Febbraio 2008, 18:49:05

Titolo: connessione database
Inserito da: g.paolo - 08 Febbraio 2008, 18:49:05
Vogliate scusare la mia grande ignoranza, ma provenendo dal mondo di Access dove è tutto abbastanza semplice, e non serve connettersi ad un DB esterno, non riesco ancora a capire come fare ad usare un DB creato con kexi all'interno di gambas.
Non so proprio dove reperire le info necessarie per capire il meccanismo di collegamento, o forse sto dicendo una grande fesseria e non me ne rendo proprio conto.
Ho importato tutte le mie tabelle in kexi il quale lavora con sqlite3, e fino che sono all'interno di questo posso fare interrogazioni, relazioni e report, ma dall'esterno non so proprio come agire.
Se non conoscete kexi, una breve descrizione in italiano la si trova in:
http://it.wikipedia.org/wiki/Kexi
perchè sul sito in lingua inglese non sono proprio riuscito a capire un accidenti.
Titolo: Re: connessione database
Inserito da: leo72 - 08 Febbraio 2008, 19:29:32
Niente di più facile.

Hai bisogno di dichiarare 2 oggetti, di tipo Connection e Result.

Ecco un esempio di connessione:
Codice: [Seleziona]

DIM Connessione AS NEW Connection
DIM Risultato AS Result

  '-- connetti al database
  Connessione.Name = Application.Path & "/nome_db"
  Connessione.Type = "sqlite3"
  Connessione.OPEN
  Risultato = Connessione.Find("nome_tabella", "tuocampo = &1", NomeVariabile)
  IF Risultato.Available = FALSE THEN
    Msgbox("Nessun campo presente in base alla query impostata")
  END IF
  Risultato["nomecampo"] = Variabile
  Risultato.Update '-- aggiorni i campi
  Connessione.Commit '-- scrivi fisicamente nel DB
  Connessione.Close

Alternativamente, al posto di Connessione.Find puoi usare Connessione.Exec("...") per eseguire una query in SQL puro.
Titolo: Re: connessione database
Inserito da: g.paolo - 09 Febbraio 2008, 08:25:13
Un grazie grosso così Leo!
A volte le cose sono semplici, ma per chi le sa già, e trovare la giusta dritta non è sempre facile.
Grazie di nuovo!
Titolo: Re: connessione database
Inserito da: leo72 - 09 Febbraio 2008, 10:47:29
Se cerchi in un mio precedente post, ho messo esempi di codice per creare, modificare e cancellare dati in un DB SQLite3.
Titolo: Re: connessione database
Inserito da: g.paolo - 17 Febbraio 2008, 15:30:35
Alla fine ci sono riuscito, adattando il codice di un esempio al mio DB. E' comunque tutto molto difficile non disponendo di una guida adeguata. Faccio un esempio: ho cercato di spezzare su due righe un comando Select lunghissimo, e qui casca l'asino. Quello che potevo fare facilmente in VB mettendo a fine riga un ";", qui non funziona, e nella guida Gambas "A beginners guide..." non trovo la soluzione.
Ho dovuto per forza ricorrere al concatenamento di due variabili stringa per ricomporre il comando, ma questo mi sembra molto riduttivo, non credete?
Titolo: Re: connessione database
Inserito da: giulio - 17 Febbraio 2008, 16:41:57
Citazione

darth14n ha scritto:
Alla fine ci sono riuscito, adattando il codice di un esempio al mio DB. E' comunque tutto molto difficile non disponendo di una guida adeguata. Faccio un esempio: ho cercato di spezzare su due righe un comando Select lunghissimo, e qui casca l'asino. Quello che potevo fare facilmente in VB mettendo a fine riga un ";", qui non funziona, e nella guida Gambas "A beginners guide..." non trovo la soluzione.
Ho dovuto per forza ricorrere al concatenamento di due variabili stringa per ricomporre il comando, ma questo mi sembra molto riduttivo, non credete?


Hai provato con "&" a fine riga. Va bene per le stringhe e per i comandi SHELL. Prova
se fa al caso tuo. Ciao.
Titolo: Re: connessione database
Inserito da: g.paolo - 17 Febbraio 2008, 18:24:47
Grazie, funziona bene con le stringhe, ma non per mettere i comandi normali su piu righe come si faceva normalmente in VB.
Quindi va bene con l'esempio seguente:

str1 = "SELECT rio_loc.id_loc, rio_loc.localita, comuni.comune, " &
       "zone.zona FROM rio_loc, zone, comuni WHERE comuni.id_com = rio_loc.id_com " &
       "AND zone.id_zona = comuni.id_zona ORDER BY rio_loc.id_loc "

ma non per spezzare ad esempio il comando:
hForm = NEW FRequest(connessione, rData)

che non puo essere scritto nel modo:
hForm = NEW FRequest &
(connessione, rData)
Titolo: Re: connessione database
Inserito da: md9327 - 17 Febbraio 2008, 19:43:20
variabile = "testo di prova"
variabile &= "altro testo"


notare bene i caratteri "&=", stessa cosa per i numer, ad esempio...
Titolo: Re: connessione database
Inserito da: md9327 - 17 Febbraio 2008, 19:45:53
Per i comandi basta che vai a capo, senza inserire alcunchè...
l'importante è che termini la frase con i giusti caratteri, ad esempio le parentesi
Titolo: Re: connessione database
Inserito da: g.paolo - 19 Febbraio 2008, 09:09:41
Ringrazio molto per la dritta e la Vs. cortese disponibilità.
Titolo: Re: connessione database
Inserito da: - 01 Marzo 2008, 20:16:49
faccio un test con sqlite :
Codice: [Seleziona]

PUBLIC Conexion As Connection
PUBLIC Resultado As Connection

PUBLIC SUB ConectarDB_Click()
Conexion = NEW Connection
Conexion.Name = Application.Path & "/TestGambas.sqlite"
Conexion.Type = "sqlite3"
Conexion.OPEN()
Resultado = Conexion.Exec("SELECT * FROM TTestGambas")
IF Resultado.Available = FALSE THEN
   Message.Error("No es disponible")
   RETURN
END IF
Conexion.Close()
END


me responde con Message = "No es disponible"

se conecta o no????

con mysql server non ho nessun problemma di gestione database.
Titolo: Re: connessione database
Inserito da: md9327 - 02 Marzo 2008, 02:32:24
Che vuol dire "con mysql server non ho nessun problemma di gestione database." ?
E' probabile che con sqlite devi fare qualche aggiustamento.

Fai qualche passo indietro:

- verifica se la connessione è veramente aperta (usa try catch, per esempio...);
- verifica se hai messo tutti i parametri necessari alla connessione;
- verifica se la tabella e il file esistono veramente;
- verifica se "Application.Path" + ritornano la corretta posizione.

Usa il debug o in alternativa metti qualche PRINT tra un comando e l'altro.
Titolo: Re: connessione database
Inserito da: leo72 - 02 Marzo 2008, 10:44:25
Prova con:
Codice: [Seleziona]

Resultado = Conexion.Find("TTestGambas")
Titolo: Re: connessione database
Inserito da: - 02 Marzo 2008, 16:47:39
per questione di lavoro sto migrando da vb6 + vs2005 + c++ verso il opensource da  + di 9 mesi.ok con monodevelop e python.
sono in apprendistato con gambas.
la situazione e cosi:
creo un database .sqlite con sqlitestudio.
mi connetto al DB.niente,non accessibile.
allora creo una row nel DB.ok,mi connetto.
questa è la situazione.cmq,mi sta bene.facile da gestire e trasportare.

Codice: [Seleziona]

- verifica se la connessione è veramente aperta (usa try catch, per esempio...);
- verifica se hai messo tutti i parametri necessari alla connessione;
- verifica se la tabella e il file esistono veramente;
- verifica se "Application.Path" + ritornano la corretta posizione.

avevo già controllato ( esperienza dal vstudio2005 )

Codice: [Seleziona]

Usa il debug o in alternativa metti qualche PRINT tra un comando e l'altro.

anche questo ( esperienza dal vb6 ),debug con la funzione passo a passo con variabili locali per tenere sott'occhio.



in Edit (dimenticavo):
Codice: [Seleziona]

Resultado = Conexion.Find("TTestGambas")

errore sql.........
Titolo: Re: connessione database
Inserito da: leo72 - 02 Marzo 2008, 18:46:32
Beh, se ti da errore di connessione allora il problema è nel database.
Prova a creare un database direttamente dalla console di sqlite3 oppure usa l'ottimo programma knoda.
La sintassi del tuo codice è giusta: se non va è per colpa del DB non di Gambas.
Titolo: Re: connessione database
Inserito da: - 02 Marzo 2008, 20:44:57
ho installato knoda.
ma non è presente un driver per sqlite,solo per mysql.
vedrò da terminale di creare un db con sqlite3.
Titolo: Re: connessione database
Inserito da: md9327 - 02 Marzo 2008, 23:43:32
Non dovrebbe... ma hai qualche altra applicazione che stà usando quel db ?
Titolo: Re: connessione database
Inserito da: md9327 - 03 Marzo 2008, 00:09:29
Con:

   Resultado = Conexion.Find("TTestGambas")

ti dà errore perchè hai scritto:

   Resultado AS Connection

invece di:

   Resultado AS Result

vedrai che funziona anche con Exec !
Titolo: Re: connessione database
Inserito da: leo72 - 03 Marzo 2008, 10:03:07
@Alejandro:
Knoda ha il driver per Sqlite3, io lo uso abitualmente.

@md9327:
è vero, non avevo visto l'errore del nostro amico :-P
Titolo: Re: connessione database
Inserito da: - 03 Marzo 2008, 18:00:33
Codice: [Seleziona]

Resultado AS Connection

errore di trascrizione,come da codice reale:
Codice: [Seleziona]

PUBLIC Conexion AS Connection
PUBLIC Resultado AS Result

PUBLIC SUB _new()
'''''''''''''''''
END

PUBLIC SUB Form_Open()
ME.Center
clvGestionColumna.Columns.Count = 8
clvGestionColumna.Columns[0].Text = "Index"
clvGestionColumna.Columns[0].Width = 100
clvGestionColumna.Columns[1].Text = "Apellido"
clvGestionColumna.Columns[1].Width = 200
clvGestionColumna.Columns[2].Text = "Nombre"
clvGestionColumna.Columns[2].Width = 200
clvGestionColumna.Columns[3].Text = "Fecha (nac)"
clvGestionColumna.Columns[3].Width = 100
clvGestionColumna.Columns[4].Text = "Ciudad(nac)"
clvGestionColumna.Columns[4].Width = 180
clvGestionColumna.Columns[5].Text = "Provincia(nac)"
clvGestionColumna.Columns[5].Width = 180
clvGestionColumna.Columns[6].Text = "Region(nac)"
clvGestionColumna.Columns[6].Width = 180
clvGestionColumna.Columns[7].Text = "Pais(nac)"
clvGestionColumna.Columns[7].Width = 180

ConectarDB
END

PRIVATE SUB ConectarDB()
DIM strDatabase AS String
Conexion = NEW Connection

IF Dialog.OpenFile() THEN
   txaConexion.Text = " Database : Ningun database elejido del utente"
   txaConexion.BackColor = &HFF0000&
   txaConexion2.Text = " No conectado al database"
   txaConexion2.BackColor = &HFF0000&
   RETURN
ENDIF
Conexion.Name = Dialog.Path
Conexion.Type = "sqlite3"
Conexion.OPEN()
Resultado = Conexion.Exec("SELECT * FROM TDBDCaserma")
IF Resultado.Available = FALSE THEN
   txaConexion.Text = " Database :" & Dialog.Path
   txaConexion.BackColor = &HFF0000&
   txaConexion2.Text = " No conectado al database"
   txaConexion2.BackColor = &HFF0000&
   RETURN
ELSE
   txaConexion.Text = " Database :" & Dialog.Path
   txaConexion.BackColor = &H0080FF&
   txaConexion2.Text = " Conectado al database"
   txaConexion2.BackColor = &H00FF00&
   CargarColumnas()
END IF
Conexion.Close()
CATCH
 Message.Info(Error.Text)
 Conexion.Close()
END

in effetti,se l'errore fosse stato la dichiarazione della variabile Resultado AS Connection anzichè Result,cmq dovrebbe buggare indipendentemente che ci sia un record o nessuno nel database,o sbaglio..
Titolo: Re: connessione database
Inserito da: md9327 - 03 Marzo 2008, 20:23:43
Se l'ultima era una domanda, allora posso dirti che dipende dal tipo di errore.
Nel tuo caso, il compilatore non poteva accorgersi dell'incompatibilità tra la variabile target e la funzione source, perchè in gambas non è ancora implementato un controllo di questo tipo; in runtime, il problema è che, nel tentativo di salvare la locazione di memoria di un tipo Result in un'altro tipo Connection, l'interprete si è trovato con un problema di conversione. In qualche modo ha tentato di creare il riferimento all'oggetto, ma poi nell'istruzione successiva, c'è il tentativo di accedere ad una proprietà della supposta classe; in questo caso l'interprete si accorto di fatto che i riferimenti erano proprio errati, e quindi ha emesso l'errore.
Problemi di questo tipo possono accadere normalmente, a volte a causa di una piccola svista, specialmente su applicazioni complesse; due modi per contenere queste sviste sono: includere il codice sospetto all'interno di una sequenza TRY...CATCH, oppure farsi due occhiaie così :fuso:  alla ricerca di eventuali errori, debuggando il codice fino all'esasperazione... :-)
Titolo: Re: connessione database
Inserito da: leo72 - 03 Marzo 2008, 23:42:35
Prova a dichiarare la connessione all'interno della procedura che accederà al DB e non a livello di oggetti globali. E poi aggiungi la parola NEW perché la connessione va creata oltre che dichiarata per poterla usare.

Codice: [Seleziona]

PUBLIC SUB Accesso_DB()
DIM Conexion AS NEW Connection
DIM Resultado AS Result
(....)
Titolo: Re: connessione database
Inserito da: - 04 Marzo 2008, 18:05:47
grazie md9327,ma forse non sono stato chiaro.era un problema di trascrizione.infatti come si vede del codice reale Resultado e dichiarato Result e non Connect.anche creando un database da terminale con sqlite3 me da lo stesso problema.adesso farò la prova di leo72.non dichiarerò Conexion come variabile publica di form di classe Connect ma come variabile locale in una sub.vi faccio sapere.
Titolo: Re: connessione database
Inserito da: - 04 Marzo 2008, 18:23:44
x leo72 e md9327
Codice: [Seleziona]

DIM Conexion AS NEW Connection
DIM Resultado AS Result
(....)

va come variabile locale invece di variabile globale. :good:
Titolo: Re: connessione database
Inserito da: md9327 - 06 Marzo 2008, 00:01:06
Non per contraddirti, sicuramente così funziona e certamente è il modo migliore nel tuo caso, ma il fatto che non funzionano come variabili pubbliche non dipende dal fatto che sono pubbliche. Probabilmente c'è qualche altra cosa che mi sfugge ma che interferisce nel loro funzionamento; attualmente utilizzo delle mie classi che hanno proprietà di questo tipo, pubbliche, e che funzionano regolarmente.

Comunque, meglio così, funziona ed è questo l'importante.

P.S.: prova a dichiararle private all'interno della classe, ad esempio:

PRIVATE $Conexion AS Connection
PRIVATE $Resultado AS Result

e usale compreso il carattere '$', e fammi sapere.


Ciao
Titolo: Re: connessione database
Inserito da: leo72 - 06 Marzo 2008, 07:54:51
Ribadisco: secondo me il motivo per cui non andava al nostro amico era perché si scordava di utilizzare la parola chiave NEW: una connessione va inizializzata oltreché creata.
Penso che potrebbe funzionare anche come:
Codice: [Seleziona]

PUBLIC Connessione AS NEW Connection

(però non l'ho provato)
Titolo: Re: connessione database
Inserito da: md9327 - 06 Marzo 2008, 23:51:00
La variabile può essere anche solo definita:

"PUBLIC variabile AS TIPO"

quando la si vuole usare, si usa la parolina chiave NEW, altrimenti và subito in errore.
Questo è sicuramente vero con gli oggetti, ma in alcuni casi e linguaggi, i tipi più a basso livello di solito vengono inizializzati ad un valore di default, come ad esempio:

int = default 0;
char = default stringa vuota.

per gli oggetti, almeno in gambas, la variabile solo definita assume valore indefinito, in pratica è come se non esistesse. A questa può essere assegnato un valore nullo (=NULL), in questo caso la variabile assume un'entità reale ma, ad ogni modo non è ancora instanziata; con NEW viene effettivamente creato l'oggetto in memoria e diventa attivo a tutti gli effetti.

In nostro amico, a parte l'errore di assegnazione, aveva correttamente definito le variabili come proprietà dell'oggetto, impostandole all'inizio del file, e nel metodo poi ha creato effettivamente l'oggetto; la logica dice che deve funzionare così, e nei miei programmi è costruito tutto in quel modo e funziona. Nella discussione ho l'impressione che sia sfuggito qualcosa, come la svista di assegnazione, oppure nel segmento di codice manca qualche istruzione non riportata... non sò...

L'ora tarda mi annebbia la vista e la mente, e probabilmente non riesco a vedere esattamente qual'è il problema.
Titolo: Re: connessione database
Inserito da: - 07 Marzo 2008, 20:16:45
provare x imparare  :hammer:

Codice: [Seleziona]

PRIVATE $Conexion AS Connection
PRIVATE $Resultado AS Result


cmq il programma funge.solo per imparare un'altra cosa.