Gambas-it
Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: Phoenix - 13 Dicembre 2008, 15:42:18
-
Allora sono passato a sqlite3 per il mio progetto (vedi post precedenti).
Prima utilizzando mysql andavo a creare la connessione in un modulo esterno al form, quando dovevo connettermi richiamavo la connessione dal modulo e riusciva a operare sul db senza dover ogni volta ripetere i dati di connessione.
Passando a sqlite3 mi sono detto "ok togliendo nome e pass e dandogli il nome del file che costituisce il db non ci dovrebbero essere probemi" .... furono le mie ultime parole famose ....
Quando richiamo la connessione mi da sempre che non trova il db o che la query non è esatta. Ho provato a fargli passare la query con sqlitebrowser e non ci sono problemi, quindi non trova il db, ho provato vari modi ma l'errore non cambia.
Posto qui sotto il contenuto del modulo ModDb
-------------------------------------------------------------------------------
' Gambas module file
PUBLIC $conn AS NEW Connection
PUBLIC $dbName AS String = "working.db"
PUBLIC $sql AS String
PUBLIC PROCEDURE Connect()
'################## MYSQL
'$conn.Close() 'chiude la connessione
'$conn.Type = "mysql" 'tipo di connessione
'$conn.Host = "localhost"
'$conn.Host = "localhost" 'nome del server
'$conn.Login = "root" 'username della connessione
'$conn.port = "3306" 'porta utilizzata dal database
'$conn.Name = "working" 'nome del database da utilizzare
'$conn.Password = "password-root" 'password di accesso
'$conn.Open() 'apre la connessione
'################## SQLITE3
$conn.Close
WITH $conn
.Type = "sqlite3"
.Host = User.Home
END WITH
$conn.Open
IF (NOT $conn.Databases.Exist($dbName)) THEN
Message.Info("Il DB non esiste", "OK")
'creo il db
$conn.Databases.Add($dbName)
Message.Info("Creo il DB", "OK")
Message.Info("Creo la tabella Utente", "OK")
$sql = "CREATE TABLE utente (attivo NUMERIC, id INTEGER PRIMARY KEY, nome_completo TEXT, uname TEXT, upass TEXT)"
$conn.Exec($sql)
ENDIF
END
PUBLIC SUB Main()
Connect() 'avvia la procedura per la connessione
END
-------------------------------------------------------------------------------
E qui posto la parte da dove parte la chiamata al modulo dal form dove serve operare con il db
--------------------------------------------------------------------------------
'inserimento dati
ModDb.Connect()
ModDb.$conn.Name = "working.db"
$sql = "insert into utente values (1,NULL,'" & $nomeCompleto & "','" & $nomeVisualizzato & "','" & $password & "')"
$result = ModDb.$conn.Exec($sql)
--------------------------------------------------------------------------------
ModDb.$conn.Name = "working.db" l'ho aggiunto dopo anche se non sono mai stato troppo convinto che servi a qualcosa.
Ho provato a operare con la connessione direttamente sul form e non ci sono problemi quindi presumo che l'errore sia nel modulo. Come posso procedere?
-
effettuare la connessione per creare il db è diverso da aprire la connessione ad un db già esistente per cui devi realizzare due funzioni diverse
nel primo caso il nome del db viene impostato come argomento di database.add
nel secondo caso prima di dichiarare $conn.open
devi dire alla connection il nome del db senno come fa a sapere quale db aprire?
quindi dopo il blocco whith iserisci semplicemente
$conn.name=$dbName
$conn.open
a questo punto il db è aperto
Inoltre per "sicurezza" io appena creo il db con le tabelle lo chiudo per poi riaprirlo per l' immissione dati.
per l' immissione dati non uso query sql ma questa tipologia di codice:
dim res as result
$hConn.Begin
res = $Conn.Create("utente")
res!attivo = 1
res!nome_completo="pippo"
.....
res.update
$conn.commit
inoltre se le variabili (nome e host e $conn ) le rendi pubbliche una volta impostate potrai aprire e chiudere il db da qualsiasi parte del programma semplicemente con $conn.open e $conn.close
senza aver bisogno di utilizzare la funzione connect() del tuo modulo
spero di essere stato chiaro ciao ciao
-
Tutto bene ...
Ho messo la creazione del db e tabelle annesse in main e la connessione in connect il tutto nel modulo ModDB.
Il moddb.main lo richiamo da fstart_show, in pratica quando viene avviata l'applicazione controlla subito se esiste il db.
Ora eseguo questo quando devo effettuare l'inserimento
ModDb.Connect
$sql = "insert into utente values (1,NULL,'" & $nomeCompleto & "','" & $nomeVisualizzato & "','" & $password & "')"
$result = ModDb.$conn.Exec($sql)
e quindi non mi è chiaro questo
"inoltre se le variabili (nome e host e $conn ) le rendi pubbliche una volta impostate potrai aprire e chiudere il db da qualsiasi parte del programma semplicemente con $conn.open e $conn.close"
Che vantaggi/svantaggi ci sono richiamando la funzione del modulo invece di richiamare la variabile?
Piccola domanda, c'è un metodo per sapere se il record è stato aggiunto per poterlo utilizzare in un IF/END IF?
Grazie per l'aiuto e i chiarimenti e se a qualcuno serve il codice completo me lo dica che lo posto.
-
In SQL non c'è modo di sapere se una INSERT ha veramente inserito il record, se non controllare il codice di errore (0=OK), o rieseguire una SELECT del record dopo la insert.
Addirittura il DELETE non ritorna nulla, a meno che la sintassi della quesry non abbia quanche errore di sintassi, o si riferisca a campi e tabelle inesistenti.
Ad ogni modo, il tedoto Exec() ritorna:
a) Result vuoto se la SELECT non ritorna dati (Count=0);
b) Result=NULL se la query è errata;
c) ERROR<>0 se si verifica un errore (applicativo o SQL);
testando queste condizioni, puoi capire cosa succede.
-
Grazie era quello che volevo sapere per l'esito delle query.
Anche se in ritardo volevo farti i complimenti per il software pgDesigner.
-
Thanks!!!
Puoi usare come spunto il codice dell'ultima versione alpha, che ho inserito nella discussione legata a pgDesigner, nella quale ho concentrato la gestione dell'interfaccia di comunicazione con il database (qualsiasi tipo) in alcune classi. Ha alcuni problemi con i campi BLOB in MySQL, ma per il resto funziona alla grande.