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 sqlliteDann 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!