SQLite Grundzeugs



  • Guten Morgen!

    Hab Probleme mit dem C Interface von SQLite ... irgendwie hab ich ne Denksperre.

    Mein Code:

    #include <iostream>
    #include <stdlib.h>
    #include <sqlite.h>
    
    sqlite *datenbank;
    
    using namespace std;
    
    int Callback( void *Pointer, int argc, char **argv, char **columnNames)
    {
      return 0;
    }
    
    int main(int argc, char *argv[])
    {
      datenbank = sqlite_open( "MeineDatenbank" , 0 , NULL);
    
      sqlite_exec( datenbank , "show tables;" , Callback,  &Pointer , NULL);
    
      sqlite_close(datenbank);
    
      system("PAUSE");	
      return 0;
    }
    

    Das 4te Argument meiner sqlite_exec muss ja das erste Argument der Callbackfunktion sein. OK, ist es. Logischerweise kennt meine main den void *Pointer - Pointer gar nicht, weil er ja in der callback steht .... 😕 😮 .... Ich bin verwirrt .... irgendwie blick ich nich durch .... 😕



  • du hast das falsch verstanden. Du kannst den Parameter einfach dafür benutzen um noch zusätzliche Informationen an die Callback-Funktion zu liefern. In deinem Fall kannst du den Parameter einfach auf 0x0 (NULL) setzen.

    Aber wenn du zB. SQLite innerhalb einer Klasse nutzen willst ist das relativ nützlich. Ist auch in C APIs der übliche weg bei Callbacks (wird zB. auch bei pthreads so gemacht oder wenn man Skriptsprachen via C Interface einbinden will), damit andere Sprachen (wie OO C++) damit umgehen können.

    Beispiel

    class foo {
      static int callback(void *ptr,int argc,char **argv,char **names) {
         return static_cast<foo*>(ptr)->real_callback(argc,argv,names);
      }
      int real_callback(int argc,char **argv,char **names);
      void bar() {
        //...
        sqlite_exec(db,"select * from foo;",foo::callback,this,NULL);
        //...
      }
      //...
    };
    


  • OK, gut.

    Trotzdem weiß ich noch nicht genau, wie ich diese Callback Funktion behandeln muss .... also

    sqlite_exec( datenbank , "show tables;" , Callback,  NULL , NULL);
    

    gibt jetzt Werte an die Callbackfunktion, die da so aussieht:

    int Callback( void *Pointer, int argc, char **argv, char **columnNames)
    {
      return 0;
    }
    

    OK. Also wäre das das Selbe wenn ich die Callback "manuell" aufrufe und irgendwas als Parameter angebe. (Ja?)
    Dann schreib ich was weiß ich zB n "cout << columnNames" in die Funktion und ich hab dann eben die Namen.

    Aber ich muss ja dazu erstmal die Funktion aufrufen, und wenn ich das tue, muss ich ihr Parameter geben. Das will ich aber nicht, das soll ja von der sqlite_exec gemacht werden.

    Könnte ich bitte einen kleinen Code haben, der mir das mal zeigt? Also zB an meinem Beispiel (show tables).

    DANKE!



  • OK, bin jetzt n Schritt weiter glaub ich. Kann es sein, dass die Callbackfunktion innerhalb der sqlite_exec aufgerufen wird? Wenn ja hat sich die Frage erledigt, aber eine neue kommt auf: Ich hab die Callbackfunktion einfach mal ergänzt:

    int Callback( void *Pointer, int argc, char **argv, char **columnNames)
    {
      cout<<"Bla Bla"<<endl;
      return 0;
    }
    

    ... es wird aber bei Aufruf der

    sqlite_exec( datenbank , "show tables;" , Callback,  NULL , NULL);
    

    Nichts angezeigt 😞





  • OK, habs jetzt ^^

    Ich poste hier mal nen kommentierten Beispielcode für die Leute, die es ebenso schwer haben wie ich (sollte es sowas geben 😉 )

    #include <iostream>
    #include <stdlib.h>
    #include <sqlite.h>
    
    sqlite *datenbank;       // unsere Datenbank
    
    using namespace std;
    
    /*
    Die Callback- Funktion gibt uns die Ergebnisse unserer Anfragen zurück:
    1ter Parameter: Ist nicht notwendig
    2ter Parameter: Anzahl der Spalten im Ergebnis
    3ter Parameter: Array von Pointern auf die Strings für die einzelnen Felder
    4ter Parameter: Name der Spalte
    */
    
    int Callback( void *Pointer, int argc, char **argv, char **columnNames)
    {
      cout<< *argv <<endl;       // Gibt die Einträge der Spalte "eintrag" aus
    
      return 0;
    }
    
    int main(int argc, char *argv[])
    {
      datenbank = sqlite_open( "MeineDatenbank" , 0 , NULL);
    
      // Tabelle anlegen und füllen:
      // (Da das nur Anweisungen sind, brauchen wir die Callbackfunktion nicht und lassen den 3ten Parameter auf "NULL")
      sqlite_exec( datenbank , "create table test(number integer , eintrag varchar(50) , primary key(number));" , NULL , NULL , NULL);
      sqlite_exec( datenbank , "insert into test (number , eintrag) values (1 , 'Testeintrag');" , NULL , NULL , NULL); 
      sqlite_exec( datenbank , "insert into test (number , eintrag) values (2 , 'Testeintrag 2');" , NULL , NULL , NULL); 
      sqlite_exec( datenbank , "insert into test (number , eintrag) values (3 , 'Testeintrag 3');" , NULL , NULL , NULL); 
    
      // Anfrage an Datenbank: Wir wollen alle Felder aus der Spalte "eintrag":
      sqlite_exec( datenbank , "select eintrag from test;" , Callback , NULL , NULL);
    
      // Das war`s, wir schließen die Datenbank:
      sqlite_close(datenbank);
    
      system("PAUSE");	
      return 0;
    }
    

    Danke nochmal für eure Hilfe!



  • fatal error C1083: Datei (Include) kann nicht geöffnet werden: "sqlite.h": No such file or directory
    

    ??


Anmelden zum Antworten