Zahl der Zeilen / Spalten bei SQLite Abfrage
-
Hio,
ich fange grade SQLite in einem C++ Programm zu verwenden.
Ein Problem habe ich noch:
Um Speicher zu reservieren für die ausgelesenen Daten müsste ich zuerst auslesen
wieviele Zeilen / Spalten meine ausgelesenen Daten haben. Also, BEVOR
ich die eigentlichen Daten Abfrage.Danke schonmal,
Max
-
Na die Spalten sollten dir denk ich mal bekannt sein, da du ja der Author des Programms bist oder?
Die Zeilen kannst ja über COUNT[] auslesen. Bekommst dann als Ergebnis die Anzahl der Zeilen der Tabelle ausgegeben. Das machst für jede Tabelle und voila hast die komplette Anzahl (Zeilen) aller Tabellen.
Eine andere Möglichkeit wäre bei der Datenabfrage die Anzahl der Zeilen und Spalten auszulesen.
if( sqlite3_get_table( database, "SELECT * FROM Tabelle;", &Ergebnis, &Anzahl_Zeilen, &Anzahl_Spalten, 0 ) != SQLITE_OK ) { error_exit( database ); }
Ergebnis erhält die einzelnen Daten, Anzahl_Zeilen die Zeilenanzahl der Tabelle und Anzahl_Spalten die Gesamtzahl der Spalten von Tabelle.
-
Erstmal danke für die Antwort.
Mit sqlite3_get_table hol ich mir ja schon meine Daten
aber wenn ich davor nicht Speicher reservier schreibt
die Funktion die Daten ja ins Nirvana.Also Spalten sind kein Problem, klar.
Wie meinst du das mit COUNT[]?
Ist das eine globale Variable?
Wenn ja wo deklariert?(Oder steh ich aufm Schlauch? :P)
Gruß,
Max
-
Ins Nirvana???
Ich weiß nicht wozu du Speicher reservieren willst? Das einzigste was du machen musst ist die entsprechenden Variablen deklarieren:
char **Ergebnis = 0; int Anzahl_Zeilen = 0, Anzahl_Spalten = 0;
sqlite3_get_table( database, "SELECT * FROM Tabelle;", &Ergebnis, &Anzahl_Zeilen, &Anzahl_Spalten, 0 );
In Ergebnis stehen ja deine Daten drin, da verschwindet nichts in Nirvana.
Index | Eintrag --------------- 1 | A 2 | B 3 | C
Da steht dann in Ergebnis folgendes drin:
Ergebnis[0] --> 1
Ergebnis[1] --> A
Ergebnis[2] --> 2
usw.In Anzahl_Zeilen steht 3. In Anzahl_Spalten 2. Reicht doch aus.
COUNT ist ein SQL Begriff.
SELECT COUNT(Index)FROM Tabelle
Das Ergebnis wäre somit 3. COUNT zählt die Einträge des gewählten Eintrags (Index).
-
ähmm...
Soweit ich weiß fordert sqlite3_get_table(...)
keinen Speicher für das Array an oder täusche ich mich?Und wenn die Methode den Speicher anfordert, wie geb ich den denn
wieder frei?Gruß,
Max
-
Den Speicher gibst du mit
sqlite3_free_table()
wieder frei. In meinem Beispiel als
sqlite3_free_table(Ergebnis)
Ich glaube allerdings, dass ich dein Anliegen entweder nicht ganz richtig verstanden hab oder wir aneinander vorbei reden.
-
Also, alloziiert (oder wie man das schreibt :D)
sqlite3_get_table den benötigten Speicher selbst?Also, was eigentlich mein Problem ist,
ich habe eine Proxy Klasse für sqlite3
geschrieben. Ich gebe die Abfrage als String
rein und kriege die Ergebnisse als char** Zeiger raus.
Das Problem hierbei ist das ich zwar in meiner Methode
in die Ergebnisse greifen kann,
wenn ich sie zurückgebe und dann drauf greifen will,
also: ergebnis[1] zum Beispiel gibts nen Fehler
von wegen Zugriffsverletzung.
-
sqlite3_get_table() allokiert seinen Speicher selbst. Daher musst du ihn mit sqlite3_free_table() wieder freigeben. Wie sich der Speicher berechnet kann ich dir leider nicht sagen, wenn das jmd. weiß würde es mich aber auch interessieren. Ich würde jetzt mal sagen, dass das mir den Zeilen und Spalten zu tun hat, liege damit aber bestimmt voll daneben.
-
Naja, die Größe des benötigten Speichers lässt sich
ja einfach berechnen.(Zeilen * Spalten) + Zeilen
Zeilen * Spalten = Die ganzen Datensätze
und dass + Zeilen = eine zusätzliche Zeile für
die "Überschriften"
dann einfach ne Schleife laufen lassen und schön
Speicher allokieren.char** ergebnis; for(int i=0; i<(zeilen * spalten) + zeilen; i++) { ergebnis[i] = new char*; }
Obwohl mir da grade auffällt, wie man
dann ganz genau allokiertda bin ich dann doch etwas
überfragt *g* ...Gruß,
Max
-
blub² schrieb:
Naja, die Größe des benötigten Speichers lässt sich
ja einfach berechnen.(Zeilen * Spalten) + Zeilen
Zeilen * Spalten = Die ganzen Datensätze
und dass + Zeilen = eine zusätzliche Zeile für
die "Überschriften"
dann einfach ne Schleife laufen lassen und schön
Speicher allokieren.char** ergebnis; for(int i=0; i<(zeilen * spalten) + zeilen; i++) { ergebnis[i] = new char*; }
Obwohl mir da grade auffällt, wie man
dann ganz genau allokiertda bin ich dann doch etwas
überfragt *g* ...Gruß,
Max
Ich glaube nicht, dass du das "+ Zeilen" noch benötigen würdest. Die Anzahl der Einträge einer Tabelle erhälst du allein schon über:
Einträge = Zeilen * Spalten
Bei sqlite3_get_table ist Ergebnis[0] immer die Überschrift der ersten Spalte, Ergebnis[1] die Überschrift der zweiten Spalte usw. Bei 5 Spalten wäre also Ergebnis[5] der erste Eintrag in Spalte 1.
-
Das ist mir schon klar, ich glaube du verstehst mich falsch.
Hier mal eine Beispiel Tabelleid | wert
-------------
0 | 100
1 | 200
2 | 300
3 | 400
4 | 500Wir haben 2 Spalten und 5 Zeilen, wären insgesamt 10 Werte,
dazu kommen noch die Überschriften.Also, Zeilen * Spalten + Spalten.