sqlite Datenbank



  • Hallo!

    Ich habe mal eine Frage bezüglich SQLITE. Hat jemand ein Beispiel wie man SQLITE in einer VCL Anwendung zum laufen bringt bzw. Daten aus einer SQL Tabelle ausgibt?

    Hier mal ein Beispiel was ich gefunden habe:

    #include <stdlib.h> 
    #include <sqlite.h> 
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    // Tabelle anlegen und füllen:
    datenbank = sqlite_open( "MeineDatenbank" , 0 , NULL);
    
      // (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);
    
    }
    

    Es gibt dort eine Anweisung mit Namen "sqlite_exec" welche die Anfrage auf die DB startet. Die Daten können dann über eine weitere FUnktion abgerufen werde:

    /*
    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;
    }
    

    Mir ist nun aber nicht klar wie ich dieses auf eine nicht-Konsolen-Anwendung übertrage.Für ein Beispiel wäre ich sehr dankbar.

    Gruß
    KMB



  • Hallo

    Das hat weniger was mit Konsole oder nicht zu tun.
    Die Callback-Fuktion muß statisch sein, darf also nicht von einer Instanz einer Klasse, zum Beispiel des Forms, abhängig sein.
    Aber dafür gibt es den Parameter, den du als "nicht notwendig" erklärst. Dort kannst du das Form übergeben. Das Prinzip ist häufig in Callback-Systemen zu finden, wie zum Beispiel in der WinAPI.

    Du must die exec-Funktion mit dem Form als Argument aufrufen.

    sqlite_exec( datenbank , "select eintrag from test;" , Callback , this , NULL); // ob 4. oder 5. Paremetr steht in der doku zu sqllite
    

    Dann kannst du dieses übergebene Form wieder aus dem Parameter der Callback-Funktion auslesen

    int Callback( void *Pointer, int argc, char **argv, char **columnNames)
    {
      TForm1* Form = reinterpret_cast<TForm1*>(Pointer);
      Form->... // Daten der Abfrage im Form auswerten
    
    return 0;
    }
    

    bis bald
    akari



  • Erstmal Danke für die Antwort akari.
    Wenn ich das Versuche so einzufügen wie du das geschrieben hast, dann bekomme ich bei dem sql_exec Befehl folgende Compiler-Fehler:

    [C++ Fehler] Unit1.cpp(124): E2034 Konvertierung von 'int (* (_closure )(void *,int,char * *,char * *))(void *,int,char * *,char * )' nach 'int ()(void *,int,char * *,char * )' nicht möglich
    [C++ Fehler] Unit1.cpp(124): E2340 Keine Übereinstimmung des Typs beim Parameter 3 ('int (
    )(void *,int,char * *,char * *)' erwartet, 'void' erhalten)

    Wo soll ich die Callback Funktion in der Header-Datei deklarieren? Ich habe diese nun in der Class TForm1 unter public eingetragen, was wahrscheinlich auch falsch ist oder?

    Danke!

    Gruß

    kmb



  • Das sollst du eben nicht tun. Deine Callbackfunktion sollte global sein. Wenn du sie unbedingt in deine Klasse (Form) packen willst, mach sie static.



  • Ahhh... jetzt hab ich's.

    IN der HEADER
    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <Graphics.hpp>
    #include <Menus.hpp>
    #include <DBGrids.hpp>
    #include <Grids.hpp>
    //---------------------------------------------------------------------------
    
    int Callback( void *Pointer, int argc, char **argv, char **columnNames);
    
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    ........
    
    IN DER CPP
    int Callback( void *Pointer, int argc, char **argv, char **columnNames) 
    { 
      TForm1* Form = reinterpret_cast<TForm1*>(Pointer); 
      //Form->... // Daten der Abfrage im Form auswerten
      Form1->Memo1->Lines->Add(argv[0]);      
    
    return 0; 
    }
    

    Vielen Dank!


Anmelden zum Antworten