SQLite - Tabelle in Array lesen
-
Hey,
ich bin neu im Gebiet Datenbanken in der C++ Programmierung.
Ich wollte meine Daten in der Tabelle "listen" und dort in der Spalte "listen_listenname" in ein Array einlesen.
Gibt es eine Möglichkeit nach diesem Prinzip, bzw. was anderes ganz einfaches, schnelles?
sqlite3* Database; if(sqlite3_open("db.sqlite3", &Database) != SQLITE_OK) { // Fehlercode } else { string listennamen[20]; int i; for(i=0; i<=20; i++) { listennamen[i] = sqlite3_get_table(Database, "SELECT listen FROM listen_listenname",?,?,?); } } sqlite3_close(Database);
Ich wäre sehr dankbar, wenn ihr einem neuling etwas weiterhelfen könntet.
Im übrigen habe ich die Dokumentationen auf der SQLite Seite schon gefunden und gelesen. Doch habe ich Probleme in der Praxis.
- myZeL
-
Hallo,
unter http://www.sqlite.org/quickstart.html ganz unten hast du doch schon ein komplettes Beispiel in C wie du an die Daten einer Tabelle rankommst.
Wo liegt genau das Problem?
-
static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i; for(i=0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; }
Das heißt also ich soll an die Callback Funktion einfach nur meine Variablen übergeben, dann wird die Tabelle ausgegeben?
Und damit ich die in einem Array habe? Soll ich dann das Ergebnis zurück geben lassen?
-
Push.
Wäre nett, wenn sich noch jemand finden würde, der mir weiterhelfen kann.
-
myZeL schrieb:
Push.
Wäre nett, wenn sich noch jemand finden würde, der mir weiterhelfen kann.
Der Aufruf sqlite3_get_table() hat als Parameter neben dem db-Handle und dem SQL-Statement
auch Zeiger auf die Anzahl gefundenen Zeilen und Spalten. Mit diesen kann man dann die einzelnen
Werte aus der Tabelle herausholen. sqlite3_get_table() allokiert den dazu notwendigen Speicher,
mann sollte ihn, wenn man den Kram nicht mehr braucht, wieder mit sqlite3_free_table() freigeben.Aufruf:
char **Pointer_auf_die_Trefferliste
int Zeilen, Spalten;sqlite3_get_table( db_Handle, Pointer_auf_die_Trefferliste, &Zeilen, &Spalten);
Werte herausholen:
char *p; // Zeiger auf ein Feld
p = Pointer_auf_die_Trefferliste[spalte + zeile * Spalten];
-
Ich hab mich nochmal intensiv mit der Materie beschäftigt^^
Trotzdem hab ich folgendes Problem: Bei der rc Überprüfung gibt es den Fehler...
sqlite3* Database; if(sqlite3_open("db.sqlite3", &Database) != SQLITE_OK) { wxLogError("Fehler bei Herstellung der Verbindung zur Datenbank!"); } else { char ***pazResult=NULL; int *pnRow=NULL; int *pnColumn=NULL; char **pzErrmsg=NULL; int rc; rc = sqlite3_get_table(Database, "select * from vokabeln", pazResult, pnRow, pnColumn, pzErrmsg); if (rc==SQLITE_OK) { wxLogError("All right, Sir!"); } else { wxLogError("Here's sth. wrong!"); } } sqlite3_close(Database);
Idee, wo der Fehler liegt? Compiler&Debugger sagen nichts.
PS: Bei pazResult musste ein NULL-Pointer gesetzt werden, da es sonst zum Programmcrash kommt, wenn die Funktion aufgerufen wird.
-
Ok - welchen Fehler denn ?
-
Ich frage, weil ichs nicht weiß.
bei RC ist irgendwo ein Problem, da ich die Meldung ausgegeben bekomme...
Meine Vermutung: Es hängt mit pazResult zusammen, denn wenn ich den NullPointer wegnehme, kommt es bei Aufruf der Funktion zum Programmabsturz.
-
Probiere mal:
char **pazResult=NULL; int pnRow; int pnColumn; char *pzErrmsg=NULL; rc = sqlite3_get_table(Database, "select * from vokabeln", &pazResult, &pnRow, &pnColumn, pzErrmsg);
Pointer können gemein sein ...
-
Ok. Vielen Dank. Jetzt hab ichs hinbekommen.
Pointer können wirklich ganz schön gemein seinVllt. bringt der finale Code den ein oder anderen irgendwann mal weiter
// Da wxDevC++ IDE -> einige wx Commands... sqlite3* Database; if(sqlite3_open("db.sqlite3", &Database) != SQLITE_OK) { wxLogError("Fehler bei Herstellung der Verbindung zur Datenbank!"); } else { char **pazResult=NULL; int pnRow; int pnColumn; char *pzErrmsg=NULL; int rc; rc = sqlite3_get_table(Database, "select * from vokabeln", &pazResult, &pnRow, &pnColumn, &pzErrmsg); if (rc!=SQLITE_OK) { wxLogError("Fehler beim Zugriff auf die Datenbank!"); } else { fstream schreiben; schreiben.open("temp_abfragen.txt", ios::out); schreiben << pazResult[0]; schreiben.close(); } } sqlite3_close(Database);