Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    110

    [C]usare le funzioni di sqlite3.h

    Ciao a tutti
    mi sto approcciando all'uso di C e sqlite, ma ho già dei problemi.
    Come prima operazione volevo provare solo ad aprire una connessione con un database sqlite e poi chiuderlo. il programma è questo

    codice:
    #include <stdio.h>
    #include <sqlite3.h>
    	 
    //using namespace std;
    	 
    	 
    int main()
    {
    sqlite3* conn;
    int i,c,sel,id;
    char app[20]="impegno";
    char delete[80];
    char read[25]="SELECT * FROM Agenda";
    char insert[130];
    double created; 
    
    
    if (sqlite3_open("prova.db", &conn) == SQLITE_OK)
    {
       printf("Database aperto correttamente \n");
    } else {
       printf("Errore durante l'apertura \n");
    }
    
    created=234567.542;
    
    printf("Quale operazione vuoi eseguire? \n");
    printf("1-Inserisci nuovi impegni \n");
    printf("2-Leggi gli impegni \n");
    printf("3-Cancella impegni \n");
    
    scanf("%d",&sel);
    
    //esecuzione delle query
    if(sel==1)
    {
    c=sprintf(insert,"INSERT INTO Agenda Values( %d,%s,%f,1,3)",id,app,created);
    printf("%s \n",insert);
    }
    else if(sel==2)
    printf("%s",read);
    else
    {
    scanf("%d",&i);
    c=sprintf(delete,"DELETE FROM Agenda Where id = %d",i);
    printf("%s",delete);
    }
    sqlite3_close(conn);
    	}
    Le query che dovrò eseguire potete anche non guardarle tanto per ora sono ininfluenti.
    Sono andato a compilare il programma con il comando
    gcc -o test provasql.c
    e mi da come errore:

    undefined reference to 'sqlite3_open()'
    undefined reference to 'sqlite3_close'
    collect2: Id returned 1 exit status

    al chè ho pensato che forse dovevo linkare direttamente sqlite3.h quindi siccome è presente sia nella cartella in cui sto lavorando sia in /usr/include ho mandato in esecuzione in questo modo

    gcc -o test prova.c -lsqlite3.h

    ma mi da il seguente errore:
    /usr/bin/ld: cannot find sqlite3.h
    collect2: Id returned 1 exit status

    se a -lsqlite3.h sostituisco tutto il percorso (/usr/include/sqlite3.h)
    mi da lo stesso errore

    sbaglio qualcosa nella compilazione??
    oppure è sbagliato qualcosa nel codice??

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non si linka il file header ... semmai quello si include.

    Il link lo fai con il file di libreria, il .lib o il .a a seconda dei casi
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    110
    ecco senza il .h funziona benissimo
    grazie

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Magi13
    ecco senza il .h funziona benissimo
    infatti sqllite è il nome della libreria (il modulo oggetto) che viene linkato e non ha a che vedere con l'include .h
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    110
    Ho ampliato il codice ma c'è qualcosa che non va...

    allora ho iniziato provando con un database di prova chiamato prova.db
    questo è strutturato in questo modo

    Nome|id

    l'ho popolato con 2 elementi
    Bobby 1
    Ciccio 2

    ho compilato ed eseguito il seguente codice

    codice:
    #include <stdio.h>
    #include <sqlite3.h>
    	 
    	 
    	 
    int main()
    {
    sqlite3* conn;
    sqlite3_stmt* result;
    char *zErrMsg = 0;
    int i,k,c,sel,ad,id;
    char app[10]="Mario";
    char delete[80];
    char read[25]="SELECT * FROM test";
    char insert[110];
    char *queries[4];	
    float created; 
    
    
    ad=sqlite3_open("prova.db", &conn);
    
    
    if (ad)
    {
         printf("Errore durante l'apertura \n");
         sqlite3_close(conn);
    } else {
         printf("Connessione riuscita \n");
    }
    
    created=234567.542;
    
    
    
    printf("Quale operazione vuoi eseguire? \n");
    printf("1-Inserisci nuovi impegni \n");
    printf("2-Leggi gli impegni \n");
    printf("3-Cancella impegni \n");
    
    scanf("%d",&sel);
    
    //esecuzione delle query
    if(sel==1)
    {
    
    id=3;
    c=sprintf(insert,"INSERT INTO test Values( %s,%d)",app,id);
    printf("%s \n",insert);
    ad=sqlite3_exec(conn,insert,NULL,0,&zErrMsg);
    if(ad)
    {
    printf("Errore nell'esecuzione della query \n");
    sqlite3_close(conn);
    }
    else
    printf("Query riuscita \n");
     
    id=id+1;
    
    }
    
    else if(sel==2)
    {
    printf("%s",read);
    ad=sqlite3_exec(conn,read,NULL,0,&zErrMsg);
    
    if(ad)
    {
    printf("Errore nell'esecuzione della query \n");
    sqlite3_close(conn);
    }
    else
    printf("Query riuscita \n");
    }
    
    else
    {
    scanf("%d",&i);
    c=sprintf(delete,"DELETE FROM test Where id = %d",i);
    printf("%s \n",delete);
    ad=sqlite3_exec(conn,read,NULL,0,&zErrMsg);
    if(ad)
    {
    printf("Errore nell'esecuzione della query \n");
    sqlite3_close(conn);
    }
    else
    printf("Query riuscita \n");
    }
    
      sqlite3_close(conn);
    
    }
    la compilazione va a buon fine
    quando mando in esecuzione la 1°query mi da sempre errore
    la 2° va a buon fine(ma non stampando niente non so se sia vero)
    la 3° va a buon fine ma quando vado a controllare mi ritrovo i 2 nomi che c'erano quindi suppongo che la query non sia stata svolta
    qualche suggerimento??
    pensavo di inserire prima degli sqlite3_exec la funzione sqlite3_prepare_v2 che dovrebbe preparare exec(o step) all'esecuzione della query

  6. #6
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    In mysql le stringhe inserite devono sempre avere gli apici:

    codice:
    INSERT INTO TEST VALUES  ('Mario', 3);
    Ma app è uguale a "Mario", non a "'Mario'" .

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    110
    giusto, con le virgolette mi ero confuso...però il problema rimane comunque mi dice che non riesce ad eseguire la query.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Visualizza la stringa zErrMsg per i dettagli dell'errore
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    110
    ecco ora ho capito meglio l'errore avevo bisogno dei permessi di root per poter scrivere nel file
    ma giusto per capire meglio il funzionamento di sqlite3, in zErrMsg memorizza solo l'errore oppure il risultato della query anche quando va a buon fine?

    Ok ho controllato da solo ^^ mi restituisce null quindi è proprio l'errore
    grazie per l'aiuto

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Prova a leggere la documentazione delle funzioni che usi prima di chiedere nel forum

    Controlla la documentazione di sqlite3_exec

    http://www.sqlite.org/c3ref/exec.html
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.