Autore Topic: Modulo per connessione DB SQLite3  (Letto 1170 volte)

Offline Phoenix

  • Gamberetto
  • *
  • Post: 10
    • Mostra profilo
Modulo per connessione DB SQLite3
« il: 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?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Modulo per connessione DB SQLite3
« Risposta #1 il: 13 Dicembre 2008, 16:51:23 »
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

Offline Phoenix

  • Gamberetto
  • *
  • Post: 10
    • Mostra profilo
Re: Modulo per connessione DB SQLite3
« Risposta #2 il: 13 Dicembre 2008, 18:20:57 »
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.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Modulo per connessione DB SQLite3
« Risposta #3 il: 14 Dicembre 2008, 12:44:40 »
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.

Offline Phoenix

  • Gamberetto
  • *
  • Post: 10
    • Mostra profilo
Re: Modulo per connessione DB SQLite3
« Risposta #4 il: 14 Dicembre 2008, 14:31:53 »
Grazie era quello che volevo sapere per l'esito delle query.

Anche se in ritardo volevo farti i complimenti per il software pgDesigner.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Modulo per connessione DB SQLite3
« Risposta #5 il: 15 Dicembre 2008, 12:16:54 »
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.