Mal ne Anfängerfrage zu Datenbankabfragen und C++...
-
Hintergrund:
Ich habe vor einigen Jahren einen Grundkurs für C++ gemacht. Heute bin ich Netzwerkadmin und programmiere nur so für mich mal privat zum lernen und experimentieren...Da unsere Warenwirtschaft eine grosse Datenbankdatei hat, bin ich mal neugierig geworden und habe folgende Frage:
Wenn ich eine Datenbankabfrage per SQL mache wie z.B.
SELECT * FROM rechnungspositionen
und erhalte eine grosse Datenmenge... Sagen wir mal 1 Mio. Zeilen...
Wie kann man diese eignetlich in C++ weiterverarbeiten? Array, Zeiger oder sonstwas?
Es interessiert mich einfach mal, wie ein richtiger Programmierer dieses in der Realität löst. Irgendwie muss das ja gehen, da ich mir die Datenbanktabelle im Management ansehen kann...
Gibt es irgendwelche Bücher, die man empfehlen kann, um sich als Anfänger in diese Thematik einzulesen? Bin halt einfach neugierig und will mein Wissen/Horizont erweitern...
Danke im voraus.
-
Och da gibt es viele Möglichkeiten.
z.B. kann man von vielen Datenbank-APIs scrollbare Cursor' bekommen. D.h. das C++ Programm muss gar nicht alle Zeilen im Speicher halten, es kann jederzeit sagen "spring zu Zeile 123", und dann kann es Zeile 123 lesen.
Damit kann man schön elendig lange Resultate in einer scrollbaren Listbox anzeigen: man lädt einfach nur die Zeilen die gerade sichtbar sind.Natürlich kann man die Daten auch alle in den Speicher laden. Wie man das macht ist im Prinzip egal. Arrays und Zeiger werden dabei sicher im Hintergrund verwendet. Selbst mit sowas rumschlagen muss man sich aber nicht, dafür gibt's ja std::vector und ähnliche nette Klassen.
Auch muss man oft nur alle Zeilen des Resultats "durchspulen" und dabei irgendwas machen. z.B. zählen wie viele davon einer bestimmten Bedingung entsprechen oder sowas. Dazu muss man auch nicht alle Zeilen auf einmal im Speicher halten, es reicht wenn man den Cursor Zeile für Zeile weiterschiebt.
-
Vielen Dank für die Information.
Jetzt macht dass mich aber noch mehr neugierig:
Kann da nicht der Arbeitsspeicher überlaufen, wenn ich "elendig lange Resultate" in einem Array oder Zeiger zwischenspeichere? Irgendwann müsste doch da jeder Arbeitsspeicher von einem PC aus den Nähten platzen?
Dass mit der Datenbank API ist mir schon eher etwas verständlich. Hört sich für mich so an wie "warum soll ich mich darum kümmern, wenn ich jemand anderen sich damit rumquälen lassen kann". D.h. ein Programmierer braucht sich darum nicht mehr zu kümmern.
Nur dass mit dem Array oderZeiger kann ich mir nicht so vorstellen wie das gehen soll. Theoretisch könnte ich ja - bösartig wie man ist - eine Schleife programmieren und einen Zeiger vollaufen lassen, bis mir der Arbeitsspeicher platzt und das Betriebssystem sich ins Nirwana verabschiedet. Sehe ich da was falsch?
-
Normalerweise muß so eine Listbox auch nicht die komplette Sammlung auf einmal anzeigen (passt auch gar nicht auf den Bildschirm), deshalb wird nur immer der Teil im Speicher gelassen, der gerade sichtbar ist (eventuell mit etwas Pufferzone nach beiden Richtungen). Wenn der Nutzer dann scrollt, werden die obersten Werte gelöscht und dafür am unteren Ende weitere Werte aus der Datenbank geholt.
PS: Und ja, ich hab' schon Fälle erlebt wo eine komplette SQL/Abfrage auf einer größeren Datenmenge in eine Combobox gebeamt wurde - hat am Ende ewig gedauert bis das Programm gestartet ist (inzwischen hat ein Kollege festgestellt, daß wir die betroffene Combobox in der Konstellation gar nicht benötigen).
-
MaximumError schrieb:
Nur dass mit dem Array oderZeiger kann ich mir nicht so vorstellen wie das gehen soll. Theoretisch könnte ich ja - bösartig wie man ist - eine Schleife programmieren und einen Zeiger vollaufen lassen, bis mir der Arbeitsspeicher platzt und das Betriebssystem sich ins Nirwana verabschiedet. Sehe ich da was falsch?
Ja, du siehst da einiges falsch.
Ist mir jetzt aber zu umständlich das alles zu erklären.Grundsätzlich stimmt aber, dass einem Programm der Speicher ausgehen kann. Ist auch irgendwie logisch. Und das kann man mit aber auch ganz ohne Datenbanken hinbekommen. Wenn man als Programmierer nicht will, dass es passiert, dann muss man eben was dagegen tun. z.B. eben nicht versuchen ein Result-Set unbekannter/unbeschränkter Grösse in den Speicher zu laden.
Gibt ja immer Wege wie man das vermeiden kann.
-
Ja, du siehst da einiges falsch.
Ist mir jetzt aber zu umständlich das alles zu erklären.Kein Problem.
Gibt es da irgendwelche Bücher, dass man empfehlen kann, um sich in diese Thematik besser einlesen zu können.
Das alles hier zu erklären dürfte wohl den Rahmen des Forums schlichtweg sprengen...