SQLite Results Problem :/



  • Hi, ich habe eben SQLlite ausprobiert. Habe den Beispielcode von der Seite ausprobiert:
    http://www.sqlite.org/quickstart.html (C/C++ Code)

    Nun meine Frage, die Daten sind, sofern der Query Positiv verlief in der Callback-Funktion verfügbar, ich frage mich, wie ich nun diese Daten in eine Variable Speichern kann, die zu Main gehört. Ich habe es schonmal mit nem globalen string probiert, aber dfer war immer leer 😕 Ich habe keine Lust mein Komplettes Programm in der Callbackfunktion laufen zu lassen. Am liebsten würde ich alle Ergebnisse in ein Array einlesen und dieses an Main zurückliefern...hoffe ich wisst was ich meine.

    Grüsse



  • Ok ich merke grade, mit einer globalen geht es, aber das ist doch nicht die einzigste Möglichkeit oder?

    Grüsse



  • Ja, das geht auch ohne Globals. Schau dir mal die Funktionen sqlite_compile() und sqlite_step() an.



  • Dankeschöne 🙂 Bin eben auch hieraufgestoßen, habe das wohl überlesen gehabt:
    http://www.sqlite.org/c_interface.html

    2.0 Accessing Data Without Using A Callback Function

    -.- Sorry, aber danke für den Tipp 🙂

    Grüsse



  • Währ aber schön, wenn dort auch stehen würde, wie man die Funktionen sqlite_compile() und sqlite_step() benutzt.

    Ich habe im Internet ein Beispiel gefunden:

    #include <stdio.h>
    #include <stdlib.h>
    #include "sqlite3.h"
    
    typedef struct sqlite_vm sqlite_vm;
    
    int sqlite_compile(
        sqlite3 *db,              /* The open database */
        const char *zSql,        /* SQL statement to be compiled */
        const char **pzTail,     /* OUT: uncompiled tail of zSql */
        sqlite_vm **ppVm,        /* OUT: the virtual machine to execute zSql */
        char **pzErrmsg          /* OUT: Error message. */
    );
    
    int sqlite_step(
        sqlite_vm *pVm,          /* The virtual machine to execute */
        int *pN,                 /* OUT: Number of columns in result */
        const char ***pazValue,  /* OUT: Column data */
        const char ***pazColName /* OUT: Column names and datatypes */
    );
    
    int sqlite_finalize(
        sqlite_vm *pVm,          /* The virtual machine to be finalized */
        char **pzErrMsg          /* OUT: Error message */
    );
    
    int main(int argc, char **argv){
        sqlite3 *db;          /*Datenbank-Objekt*/
        sqlite_vm *dbcursor;
        char *dberr = 0;      /*Fehlermeldungen*/
        char *sql;            /*SQL-Kommandos*/
        const char *sqltail;
    
        /*
        * Datenbankdatei öffnen
        */
        if(!sqlite3_open("test2.s3db", &db)){
            printf("Hoppla: %sn", dberr);
            free(dberr);
            return 1;
        }
    
        /*
        * Beispiel für Select-Statement
        */
        sql = "SELECT * FROM Mitarbeiter";
        /* Lege Statement-Cursor an (Konstruktor) */
        if(SQLITE_OK != sqlite_compile(db, sql, &sqltail, &dbcursor, &dberr)) { //Zeile 48
            printf("Oha: %sn", dberr);
            free(dberr);
        }else{
            int ncols;        /*Anzahl zurückgegebener Spalten*/
            const char **colnames;  /*Spaltennamen*/
            const char **values;    /*Spalteninhalte*/
    
            /* arbeite Ergebnis mit Cursor ab */
            while (SQLITE_ROW == sqlite_step(dbcursor, &ncols, &values, &colnames)) { //Zeile 57
                printf("nr='%s', name='%s'n", values[0], values[1]);
            }
        }
    
        /*
        * Datenbank schließen
        */
        sqlite3_close(db);
    
        return 0;
    }
    

    Aber wenn ich den Code Compilieren möchte bekomme ich folgende Fehler:

    obj\Debug\main.o:: In function `main':E:/Daten/Dokumente/.Dokumente/Projekte/CodeBlocks/sqlite2/main.cpp:49: undefined reference to `sqlite_compile(sqlite3*, char const*, char const**, sqlite_vm**, char**)'
    :E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:58: undefined reference to `sqlite_step(sqlite_vm*, int*, char const***, char const***)'
    :: === Build finished: 1 errors, 0 warnings ===
    

    Ich habe die lib aber eingebunden.



  • Hallo !
    Als Neumitglied fang ich leider gleich mit dem Ausbuddeln eines uralten Beitrags an....

    Ich steh als Nichtprogrammierer vor der Aufgabe ein MySQL-Plugin für SQLite3 umzuschreiben. Im Großen und Ganzen ist mir inzwischen auch klar was und wie ich da zu tun habe - auch dank der Beispiele im Netz wie obiges.
    Was mir bei diesem Beispiel nicht ganz klar ist :
    1. anstatt prepar-step-finalize wird hier sqlite3_compile verwendet. So wie ich das sehe, wird damit vor allem eine automatische Fehlerprüfung durchgeführt, die man in der Regel aber mit SQLITE_OK und SQLITE_ROW durchführt (ist zumindest so bei stackoverflow). Weshalb wird denn das sonst benutzt bzw. wo liegt denn der Vorteil in der Verwendung ? Übersichtlicher und vom Aufbau logischer ist da für mich die "normale" Methode mit prepare.
    2. Weshalb wird denn da eine "virtual machine" eingeführt ? Da muß ich gestehen, daß ich das ganze Konzept nicht verstehe. Ist das nur individueller Programmierstil oder steckt da mehr dahinter ?

    Ich hoffe, es findet sich jemand, der mir das in einfachen Worten erklären kann/will.
    Vielen Dank schon mal.
    Gruß, delix


Log in to reply