Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: g.paolo - 05 Maggio 2008, 14:52:35

Titolo: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 14:52:35
Mi trovo a dover creare una nuova tabella via codice, ma tutte le varie sintassi provate finora mi hanno sempre restituito errori.
Un tipo di sintassi che ho usato è la seguente:
sql = "CREATE TABLE 'prova' ('id' INTEGER PRIMARY KEY, 'prova' CHAR)"
result = conn.exec(sql)
In altri esempi ho trovato l'omissione degli apici, ma anche in tal modo non sembra funzionare.
Avete gia risolto questo problema?
Titolo: Re: query sqlite3
Inserito da: md9327 - 05 Maggio 2008, 15:48:21
Prova a mettere il punto e virgola ";" finale in fondo alla stringa; lo standard lo prevede per chiudere il comando SQL.
Inoltre, non serve mettere il risultato dell'exec in una variabile, perchè il comando non restituisce nulla, a meno che non si verifichi un errore, nel qual caso devi andarlo a tracciare con la classe Error o con TRY...CATCH.
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 18:56:51
Come al solito sei sempre tu che mi rispondi, sei impagabile!
Ora provo a fare come dici, a volte una semplice sciocchezza ti fa perdere ore intere!
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 19:24:35
Niente da fare, non capisco proprio!
Questo è il codice che ho provato, ma l'errore è sempre lo stesso:
Query failed: SQL error or missing database

Codice: [Seleziona]
WITH connessione 
        .Name = user.home & nomeDB                            
        .Type = "sqlite3"
        .OPEN
        .Begin
       
        sql = "CREATE TABLE prova("
        "id integer NOT NULL primary key autoincrement, "
        "descrizione char);"

        .Exec(sql)
        .Commit
        .Close
END WITH
CATCH
    Message.Error(Error.Text)
    connessione.Close    
END
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 20:25:12
nei parametri di connessione non hai impostato il parametro host (percorso)
inoltre prova anche a indicare la lunghezza anche per i campi integer (a parte l' id)

Codice: [Seleziona]

WITH connessione
        .Name = user.home & nomeDB                            
        .Type = "sqlite3"
        .Host=percorso del db
        .OPEN
        .Begin
       
        sql = "CREATE TABLE 'prova' ("id INTEGER PRIMARY KEY,"
        sql=sql & " 'descrizione' VARCHAR(255) DEFAULT NULL);"

        .Exec(sql)
        .Commit
        .Close
END WITH
CATCH
    Message.Error(Error.Text)
    connessione.Close    
END
 

così dovrebbe funzionare
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 20:55:30
Il problema non sta nell'host visto che tutto il resto funziona perfettamente. Infatti il "name" contiene gia il percorso corretto del DB.
Ho provato a copiare le righe del tuo comando SQL ma l'errore continua, stavolta col messaggio "unexpected id".
Ho provato a modificare ancora la sintassi, ma la cosa non vuole proprio andare!
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 20:56:51
scusa ho fatto un errore  :muro: così è corretto:

Codice: [Seleziona]

WITH connessione
        .Name = user.home & nomeDB                            
        .Type = "sqlite3"
        .Host=percorso del db
        .OPEN
        .Begin
       
        sql = "CREATE TABLE 'prova' ('id' INTEGER PRIMARY KEY,"
        sql=sql & " 'descrizione' VARCHAR(255) DEFAULT NULL);"

        .Exec(sql)
        .Commit
        .Close
END WITH
CATCH
    Message.Error(Error.Text)
    connessione.Close    
END
 
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 21:00:56
Niente da fare! Stesso errore iniziale.
Il bello è che funziona tutto quanto, qualsiasi comando exec, find. edit, etc.
ma solo col create mi da il problema
La cosa interessante è che il comando non sembra nemmeno avere bisogno del carattere di unione &.
Facendo il debug. il risultato di sql è identico sia nel tuo esempio, sia in questo qui:

        sql = "CREATE TABLE 'prova' ('id' INTEGER PRIMARY KEY,"
                " 'descrizione' VARCHAR(255) DEFAULT NULL);"
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 21:05:15
impossibile ho proivato a me funziona ti posto il programmino di prova , per ogni tavola nuova cambia il nome nel text box.

non è che stai creando una tavola che gia esiste? (2 tavole con stesso nome?)
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 21:06:49
in questi casi in cui non si capisce bene dovè il problema ti consiglio di commentare le operazioni di ricerca errore così il compilatore si bloccas esattamente nel punto critico
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 21:06:54
No, no, la tavola non esiste affatto, tranquillo!
Ora provo a caricare il tuo esempio.
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 21:08:20
il risultato deve essere:

Codice: [Seleziona]
sql = "CREATE TABLE 'prova' ('id' INTEGER PRIMARY KEY, 'descrizione' VARCHAR(255) DEFAULT NULL);"
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 21:12:59
giusto per sicurezza prova ad aprire il bd con sqlitebrow così vedi subito se c'è  qualcosa di strano nel db
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 21:15:09
Aperto il DB e tutte le tabelle, funziona tutto.
Ma il problema resta. Sto provando col tuo esempio in cui ho dato il mio percorso del DB ma sono alle prese con un'altro errore, stavolta un "null object"
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 21:19:27
il mio esempio crea un db ..per quello c'è l' errore te lo modifico per fare solo apertura e riposto
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 21:21:05
eccolo
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 21:21:49
clicca su crea db per effettuare la connessione al db


piccolo errore scusa, utilizza questo
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 21:34:28
Ho provato allora il tuo ultimo esempio modificando pippo con il mio DB.
Il risultato è lo stesso: query failed....etc.
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 21:36:41
ci sfugge qualce cavolatina!
mi posti la schermata del compilatore quando ti da errore
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 21:39:00
già che ci sei posta anche la shermata di sqlitebrowser del tuo db alla scheda Database structure
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 21:41:02
Ecco la schermata!
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 21:44:10
più che un errore sql secondo me manca il database lo dico solo perche la query sql a me funziona.
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 21:45:05
Non uso sqlitebrowser per il DB ma kexi, comunque il DB funziona bene perchè ho provato ad aprire tutte le tavole con il prg in gambas e fare diverse operazioni.
Ecco la schermata del DB in kexi
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 21:45:38
prova a togliere cmq le due virgolette dopo KEY ," della prima riga di sql
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 21:48:18
Provato! Nessun errore stavolta ma la tabella nuova non viene creata.
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 21:49:22
immagino che le tabelle esistenti non le hai create con gambas

mi fai un favore ?
apri il db con sqlbrowser (te lo posto ) e mi posti la schermata
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 21:56:30
Le tabelle non le ho create con gambas ma le ho importate con kexi.
Ecco la schermata di sqlitebrowser.
Mi sono accorto ora che la tabella esiste! E c'è anche altra roba che non serve!
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 22:00:50
Ho capito! E' proprio un problema di kexi. Quello che in sqlitebrowser vedi, non esiste invece in kexi. Bella roba!
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 22:01:06
secondo me il problema e questo:

con gambas npn puoi aggiungere tabelle a un db sqlite creato con kexi

del resto con kexi non riesci ad aprire un db creato con gambas.

se devi aggiungere tabelle nel tuo programma ti consiglio di farti prima un programma che trasferisca tutti i dati del tuo db in uno identico ma creato tutto in gambas, dopo di che utilizzerai sempre il db di gambas

se ti serve una mano chiedi pure
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 22:06:00
Ti ringrazio molto, sei stato molto, anzi fin troppo cortese!
Da solo non ci sarei mai arrivato.
Ora provo a studiarmi un po il tuo sqlitebrowser e vedere come funziona. Per il resto devo pensare un pochino a cosa fare.
Non è che dovessi creare molte tabelle, ma penso mi convenga proprio crearmi una funzione di classe che da un file .csv mi crei la table e mi importi tutti i dati!
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 22:07:45
si forse è la cosa migliore, del resto non è troppo difficile una voltas che si sa che tipo di separatori vengono utilizzati
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 22:12:19
Esatto! Visto che la importo da Access in un file .xls, poi la salvo in formato testo separato da TAB, visto che nei testi le virgole e punti e virgola sono troppo comuni.
Ci ho gia provato con successo, il problema era solo quello di creare la struttura della table, perchè con una gia strutturata la cosa l'ho gia realizzata.
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 22:15:51
allora sei a cavallo!!!
Titolo: Re: query sqlite3
Inserito da: g.paolo - 05 Maggio 2008, 22:20:33
Grazie di nuovo e buon lavoro!
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 22:23:07
di nulla ! ciao ciao
Titolo: Re: query sqlite3
Inserito da: fsurfing - 05 Maggio 2008, 22:46:06
una piccola precisazione:

probabilmente in un db di kexi si può creare tabelle con gambas solo che queste non vengono visualizzate da kexi in quanto non presenti nel suo sistema di indice di progetto
Titolo: Re: query sqlite3
Inserito da: leo72 - 06 Maggio 2008, 17:46:10
Posso suggerire un gestore di DB SQLite3 che non mi ha mai dato problemi? Knoda.
Titolo: Re: query sqlite3
Inserito da: g.paolo - 06 Maggio 2008, 20:23:49
Grazie leo, lo proverò senza dubbio.
Dopo aver abbandonato definitivamente kexi che si è dimostrato alquanto "inaffidabile" per un uso con gambas, si pone senza dubbio il problema di trovare qualcosa che lo sostituisca che sia veramenete valido.
Sqlitebrowser è molto semplice ed affidabile a quanto pare, ma forse knoda ha qualche funzione in più? Vediamo!
Titolo: Re: query sqlite3
Inserito da: fsurfing - 06 Maggio 2008, 20:31:28
secondo me se si deve manipolare solo sqlite è preferibile sqlitebrowser (ho notato che in ubuntu 8.4 è presente nei reposity)mi sempra molto più semplice e supporta anche l' importazione di file cvs e txt.
ho avviato knoda ma mi accetta solo db mysql non riesco a impostarlo per i db sqlite
Titolo: Re: query sqlite3
Inserito da: fsurfing - 06 Maggio 2008, 20:35:15
posto questo messaggio qui per non aprire un nuovo post.

oggi ho trovato questa query sql per otteere l' elenco delle tavole di un db sqlite

Codice: [Seleziona]
"SELECT name, sql FROM sqlite_master WHERE type='table' ORDER BY name;"


qualcuno sa invece la query per ottenere l' elenco dei field di una tavola?

ho provato con

Codice: [Seleziona]
"PRAGMA TABLE_INFO(nome tavola);"


ma sembra non funzionare!
Titolo: Re: query sqlite3
Inserito da: g.paolo - 06 Maggio 2008, 21:24:21
Ma non conviene usare un ciclo  tipo "For each campo in fields"
per trovare i nomi dei campi?
Titolo: Re: query sqlite3
Inserito da: fsurfing - 06 Maggio 2008, 21:46:31
l' idea sembra buona ma realizzarla in pratica ? :-)
Titolo: Re: query sqlite3
Inserito da: leo72 - 07 Maggio 2008, 00:11:21
Per attivare Knoda per gestire tutti i DB più diffusi bisogna installare le rispettive librerie libhk-classes-NOMEDB (esempio: libhk-classes-sqlite3, libhk-classes-sqlite, libhk-classes-postgres ecc...).
Titolo: Re: query sqlite3
Inserito da: g.paolo - 07 Maggio 2008, 07:50:55
@fsurfing
Questa routine funziona come vuoi tu, basta solo che cambi il nome della tabella e del DB e che la adatti al tuo scopo. ciao!

Codice: [Seleziona]
PUBLIC SUB nomi_campi()                                   
'---------------------------------------------------------------------------------------
    'stampa in console i nomi campo di una table
'---------------------------------------------------------------------------------------
 DIM connessione AS NEW Connection      
 DIM campo AS Integer
 DIM result AS Result
 DIM nomeDB as String="tuoDB"              
    INC Application.Busy
    WITH connessione
    .Name = user.home & nomeDB                   'percorso e nome del file di database sqlite3
    .Type = "sqlite3"
    .OPEN
    .Begin
       result = .Exec("select tuatable.* from tuatable")
       campo = 0                                                'reset contatore di posizione campo  
        FOR EACH result.Fields                        'cicla sui campi
            PRINT result.Fields[campo].name & " ";                      
            INC campo                                           'indice di campo
        NEXT
    .Commit
    END WITH 'connessione
    connessione.Close
    DEC Application.Busy
CATCH
    Message.Error(Error.Text)
    connessione.Close
END

Titolo: Re: query sqlite3
Inserito da: fsurfing - 07 Maggio 2008, 11:59:40
grazie mille funziona alla grande! non ci avevo pensato ! :-)



c'è solo un piccolo errore nella linea:
Codice: [Seleziona]
result = .Exec("select tuatable.* from tuatable") 


che deve essere corretto con:

Codice: [Seleziona]
result = .Exec("select * from tuatable") 
Titolo: Re: query sqlite3
Inserito da: g.paolo - 07 Maggio 2008, 12:10:12
Non mi sono mai posto il problema dell'errore che dici perchè ha sempre funzionato. Quando una cosa funziona non mi pongo problemi, che dici?
Titolo: Re: query sqlite3
Inserito da: fsurfing - 07 Maggio 2008, 13:22:09
hai ragione! avevo sbagliato io ed avevo omesso il punto dopo il primo nometavola,

sono corrette entrambe le espressioni.
 :oops:
Titolo: Re: query sqlite3
Inserito da: g.paolo - 07 Maggio 2008, 14:44:57
Bene! Sono contento di poter contribuire anch'io con la mia misera preparazione.
A volte, come ho gia detto, la soluzione è proprio li davanti al naso e non si vede, presi come siamo da mille pensieri!
Titolo: Re: query sqlite3
Inserito da: md9327 - 07 Maggio 2008, 16:33:48
Aggiungo anche io una piccola precisazione:

nel caso la query comprenda più tabelle, e alcuni dei campi hanno nomi uguali, è obbligo anteporre al nome del campo il nome della tabella di appartenenza e il punto, allo stesso modo nell'esempio di darth.
In alternativa, è possibile definire un alias per ogni tabella (es. "FROM tabella1 AS tbl1"), e poi anteporre quest'ultima ad ogni campo definito nella query.
In tutti i casi, la sintassi è valida per tutti i motiri rdbms presenti sul mercato e non (es. Oracle, PostgreSQL, MySql, ecc.), dato che questa fà parte dello standard SQL-92.

Bye