SQLite will nicht!



  • Hi,
    Ich arbeite zum ersten mal mit datenbanken in C++ für ein Projekt.
    Ich habe mich für SQLite entschieden.
    Auf der Homepage heißt es man soll sich den Source Code ziehen und ihn compilen um die lib und header files zu bekommen.
    So das habe ich mit MSYS gemacht zuerst "./configure" und dann make, dann hatte ich meine files und hab sie in mein Projekt eingebaut.
    Hier mal mein Code von der Headerdatei(ist nicht komplett so:

    #include <sqlite3.h>
    #include <stdlib.h>
    class database {
    private:
    sqlite *datenbank;
    char* buffer;
    public:
    database();
    ~database();
    void exec(char* befehl);
    char* exec2(char* befehl);
    };
    

    Folgende Fehler bekomme ich:

    error: `datenbank' was not declared in this scope
    error: `sqlite_exec' was not declared in this scope
    

    Das sind aber alles Befehle die in der Doku stehen und die Headerdatei sowie lib sind eingebuden?!?!
    Hoffe es kann mir jemand helfen!
    Schönen Abend noch.
    MFG ReduX



  • Kannst du bitte auch den Teil des Programms zeigen, in dem diese Fehler auftreten? (sqlite_exec wird gar nicht erwähnt und "datenbank" nur bei der Member-Definition)



  • Hallo ReduX,

    ab der SQLite Version 3 haben sich die Typbezeichnungen und die Funktionsnamen geändert.

    Richtig ist:

    int sqlite3_exec(
      sqlite3*,                     /* An open database */
      const char *sql,              /* SQL to be executed */
      sqlite3_callback,             /* Callback function */
      void *,                       /* 1st argument to callback function */
      char **errmsg                 /* Error msg written here */
    );
    

    und

    typedef struct sqlite3 sqlite3;
    

    Gruß Peter.



  • Hi,
    Danke für eure Antworten.
    Soweit läufts nur irgendwie kapier ich das mit den Callbacks nicht.
    Also das hab ich jetzt:
    im Public Berreich der Klasse hab ich ne funktion names callback erstellt:

    char* callback(void *daten, int anzahl, char **felder, char **spalten);
    

    und dann:

    sqlite3_exec(datenbank,befehl,callback,0,NULL);
    

    So nun bekomme ich:

    error: argument of type `int (database::)(void*, int, char**, char**)' does not match `int (*)(void*, int, char**, char**)'
    

    Habe aber keinen Plan warum.
    Am liebsten würde ich dort wo ich sqlite3_exec ausführe dann in ein integrer die anzahl der ergebnisse speicher und in ein char* das ergebniss dazu, aber ist das irgendwie ohne diese Callbacks möglich?

    MFG ReduX



  • Hallo ReduX,

    Du musst die Callback-Funktion außerhalb deine Klasse definieren.
    Wenn Du ohne Callbacks arbeiten willst dann schau dir mal die Funktionen

    sqlite3_prepare()
    sqlite3_step()
    sqlite3_finalize()
    

    in der Dokumentation an.

    Gruß Peter



  • Hi,
    Sry das ich nochmal Störe.
    Also ich hab nun folgendes:

    sqlite3_stmt *stmt;
    sqlite3_prepare(datenbank,befehl,strlen(befehl),&stmt,0);
    sqlite3_step(stmt);
    sqlite3_finalize(stmt);
    

    So damit kann ich auch ganz toll Befehle ausführen und so, nur wie kann ich das jetzt so machen wie ich es beschrieben habe?
    weil nach sqlite3_step() hab ich ja dann den ROW handler aber den muss ich ja irgendwie auflösen bevor ich mit finalize das stmt wieder löschen!

    MFG ReduX



  • Hallo ReduX,

    sieh die mal die Funktionen:

    sqlite3_column_text()
    sqlite3_column_int()
    ...
    sqlite3_column_double()
    

    an.
    Hier findest Du die Doku:
    http://www.hwaci.com/sw/sqlite/capi3ref.html#sqlite3_column_blob

    Gruß Peter.



  • Hi,
    Habs damit nun so hinbekommen wie ich wollte.
    Vielen Dank für die Hilfe!

    MFG ReduX


Anmelden zum Antworten