Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » arbeitenmit Datenbanken und C++

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
13.06.2016, 14:19 Uhr
Kaffeebart



Hallo

ich bin absoluter Anfänger im Bereich C++

Mit folgender Anleitung habe ich mir eine MySQL Datenbank ins Projekt (bzw. Visual Studio) integriert.
https://www.youtube.com/watch?v=237TCFoPeaE

Nun weiss ich aber nicht wie ich auf diese Daten zugreife und mit denen arbeite.

Befehle aus MySQL sind kein Problem. Ich aber leider nicht wie ich diese in C++ benutze, sodass ich auf die richtigen Daten zugreife.

Ich habe nach Tutorien gesucht aber irgendwie nichts brauchbares gefunden. - Hat jemand einen Tipp, wo ich eine Anleitung oder Tutorial finde?
Oder kann mir schnell die ersten und wichtigsten Schritte selber erläutern?

Vielen lieben Dank
Stefan

Ich arbeite mit einer Konsolenanwendung in Visual Studio 2014 auf Windows XP
Die MySQL Datenbank läuft mittels XAMPP auf dem Rechner.
--
Gruss
Stefan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.06.2016, 17:34 Uhr
Hans
Library Walker
(Operator)


Hi,

für Datenbankzugriff aus Programmen heraus gibt es die ODBC-Schnittstelle, die ein standardisiertes Interface dafür ist. Wenn Du allerdings noch keine Ahnung von C bzw. C++ hast, nützt Dir dieses Interface auch nichts, da dessen Anleitung die Vertrautheit mit C bzw. C++ voraus setzt. Mit entsprechenden Tutorials dürfte es sich ähnlich verhalten. D.h. erst einmal C oder C++ lernen, danach kannst Du Dich mit dem Zugriff auf Datenbanken via ODBC aus C/C++ heraus beschäftigen.

Einen guten Einstieg in C++ bietet das Buch: "Der C++ Programmierer" von Ulrich Breymann; darin gibt es weiter hinten auch ein Kapitel zur Datenbankeinbindung. In meiner Auflage von 2011 mit SQLite. Seitdem gab es aber schon 2 überarbeitete Neuauflagen, sodass in der aktuellen Auflage auch eine andere Datenbank verwendet werden könnte. - Genaues weis ich dazu aber nicht.

Wenn Du ins kalte Wasser springen willst, dann empfehle ich die ODBC-Seiten von Microsoft: https://msdn.microsoft.com/en-us/library/ms710252%28v=vs.85%29
Aber wie gesagt: Da besteht die Gefahr, dass Du nur Bahnhof verstehst, obwohl von Zug die Rede ist.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 13.06.2016 um 17:37 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.06.2016, 22:55 Uhr
Kaffeebart



Hallo Hans

Danke für deinen Input.
Ok differenzieren wir ich stehe bei C++ nicht ganz bei Null. Habe durchaus schon einzelne Programmteile verarbeitet und zum laufen gebracht.
So steuer ich z.B. diverse Hardware über C++ an.
Das Buch C+ für Spieleprogrammierer von Heiko Kalista habe ich etwa zur Hälfte durch gearbeitet.

Ich behaupte dennoch, dass ich absoluter Anfänger bin - einfach weil ich es nicht wirklich anwende.

Anleitungen von Microsoft finde ich allgemein nicht verständlich. Den Bereich hatte ich mit google zuvor auch schon gefunden aber bin eben nicht schlau draus geworden.

Ob SQLite für die Aufgabe welche ich meistern muss ausreichend ist wäre die Frage.

Nun ich hol mal etwas weiter aus und versuche zu erklären was ich vor habe, vielleicht wird dann auch etwas deutlicher ob oder wie man mir helfen kann

Ich möchte ein online Spiel programmieren (php, Javascript, HTML, MYSQL)
Für dieses Spiel brauche ich Daten von Städten weltweit.
Für jede Stadt benötige ich die Einwohnerzahl in einem bestimmten Umkreis.

Datenbank mit Städten, geographischen Koordinaten und Einwohnern habe ich. (ca. 3.5 Mio Einträge)
Nun muss ich für jede Stadt zu allen anderen die Entfernung berechnen (mit einer recht komplexen Formel) und dann die Einwohnerzahlen die im Umkreis liegen aufaddieren.
In PHP habe ich ein Script geschrieben, wass diese Aufgabe erledigt.
Ich hoffe aber, dass ich mit C / C++ das ganze sehr viel schneller hinbekomme weil man ja mit dieser Sprache näher am Prozessor arbeitet.
Bleibe ich beim PHP Script, so befürchte ich dass mein PC einige Monate ununterbrochen laufen wird.

Also ich bin beim proggen kein völlig unbeschriebenes Blatt.

Wie eingangs erwähnt habe ich die ODBC Schnittstelle im Projekt bereits einrichten können. Was ich nicht weiss ist wie greife ich auf diese Schnittstelle zu?
Ganz konkret brauche ich nur zwei Sachen. wie lese ich einen bestimmten Datensatz aus und wie ändere ich einen bestimmten Datensatz?
welche Header und kommandozeilen braucht es dazu?
Ich möchte keine Komplettlösung - ich kämpf mich schon selber durch, wenn es irgendwo verständlich erklärt ist.
Evtl. mit einem Beispiel dass Schritt für Schritt aufgebaut wird damit man es nachvollziehen kann.


Da ich C / C++ im Moment nicht für viel mehr brauche möchte ich diese Sprache nicht komplett lernen um das andere Projekt weiter machen zu können. Im Moment bin ich mit PHP und Javascript genügend bedient und muss auch da noch einiges dazu lernen.
--
Gruss
Stefan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.06.2016, 09:52 Uhr
ao

(Operator)


3,5 Millionen Orte, und du willst die Entfernungen zwischen allen Paaren? Das sind 3,5 Millionen hoch 2, also mehr als 12 Billionen Datensätze - hast du eine Ahnung, wie gigantisch diese Datenbank wird? Und 99,99 Prozent dieser Datensätze wirst du nie im Leben brauchen, wetten?

Ich würde sagen, vergiss das und mach ein neues Design, das nur die Entfernungen, die tatsächlich benötigt werden, auf Anforderung berechnet. Das kannst du weiterhin mit PHP machen, dazu brauchst du kein ODBC.

Dieser Post wurde am 14.06.2016 um 09:55 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.06.2016, 10:43 Uhr
Kaffeebart



Hallo ao .. das hast du etwas falsch verstanden. Ich brauche nicht alle Entfernungen gespeichert.
Ich brauche die Einwohnerzahlen vom Umkreis gespeichert. Also lediglich ein zusätzliches Feld pro Stadt.

Und ja ich weiss dass das ein enormer Rechenaufwand ist, bis die Zahlen ermittelt sind ;-) genau deswegen will ich es mit C und nicht mit php machen.

Alternative wäre, dass ich diese Berechnung nur für neu ausgewählte Städte durchführe, die vom Spieler hinterher benötigt werden. Allerdings könnte dass dann auch wieder ewig dauern, bis die Daten dem Nutzer zur Verfügung stehen.
Im weiteren Fortschritt des Spieles, wenn dann einige Spieler expandieren könnte ich mir vorstellen das ein Nachtlauf dann nicht mehr genügt um all die benötigten zahlen zu rechnen, deswegen will ich es lieber von vorn herein in der DB haben, bevor ich damit live gehe.
--
Gruss
Stefan

Dieser Post wurde am 14.06.2016 um 10:44 Uhr von Kaffeebart editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.06.2016, 12:01 Uhr
ao

(Operator)


Wie wärs denn, wenn du die Datenbank so umformatierst, dass du nicht jedesmal die ganze Erde absuchen musst, wenn die Orte im Umkreis von Stadt XY brauchst?

Abhängig von der Definiton von "Umkreis" könntest du zu jeder Stadt ermitteln, welche Orte drinnen liegen, das dürfte eine übersichtliche Liste sein. Da das datenbankweit nur einmal gemacht werden muss, ist es fast egal, wieviele Nächte das dauert. Danach musst du nur noch Änderungen (also Neugründungen oder Aufgaben von Orten) einpflegen, und das dürfte schnell gehen.

Meine Empfehlung wäre: Implementier das Ganze erstmal in PHP oder in einer anderen Sprache, die du beherrschst. Und erst, wenn du dabei tatsächlich auf Performanceprobleme stößt, solltest du dir Gedanken um mögliche Optimierungswege machen.

Eine C-Implementierung ist eine mögliche Optimierung (wobei das Potential vorher ausgelotet werden sollte durch einen Vergleich der Rechengeschwindigkeiten - bei solchen Einschätzungen kann man sich sehr täuschen), eine andere wäre die Vereinfachung der Mathematik: Anstelle von sphärischer Geometrie (Bahnlänge auf der Kugeloberfläche) bestimm einfach mal die Länge der Kreissehne zwischen zwei Orten. Wenn der Winkel am Kugelmittelpunkt sehr spitz ist (und das ist er, wenn Städte im Umkreis liegen), machst du dabei nur einen sehr kleinen Fehler, vielleicht kannst du den vernachlässigen.

Dieser Post wurde am 14.06.2016 um 12:18 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.06.2016, 13:09 Uhr
Kaffeebart




Zitat von ao:
Wie wärs denn, wenn du die Datenbank so umformatierst, dass du nicht jedesmal die ganze Erde absuchen musst, wenn die Orte im Umkreis von Stadt XY brauchst?

... Da das datenbankweit nur einmal gemacht werden muss, ist es fast egal, wieviele Nächte das dauert. Danach musst du nur noch Änderungen (also Neugründungen oder Aufgaben von Orten) einpflegen, und das dürfte schnell gehen.

Genau so war es gedacht. Ein zusätzlicher Eintrag pro Stadt indem ich direkt die Einwohner im gewünschtem Umkreis eintrage.
Deswegen habe ich dennoch initial einmal den enormen Aufwand das für jed Stadt durch zu rechnen.


Zitat von ao:
Meine Empfehlung wäre: Implementier das Ganze erstmal in PHP oder in einer anderen Sprache, die du beherrschst. Und erst, wenn du dabei tatsächlich auf Performanceprobleme stößt, solltest du dir Gedanken um mögliche Optimierungswege machen.

Ist bereits geschehen (siehe weiter oben im 2. Beitrag von mir. Wurde mit PHP geschrieben) .. nach irgendwas um die 3 Wochen Dauerrechnen habe ich etwa 150 - 200 Tausend Städte berechnet. - Daher ist meine Hoffnung, dass man in C doch eine bessere Performance hin bekommt.


Zitat von ao:
Eine C-Implementierung ist eine mögliche Optimierung (wobei das Potential vorher ausgelotet werden sollte durch einen Vergleich der Rechengeschwindigkeiten - bei solchen Einschätzungen kann man sich sehr täuschen), eine andere wäre die Vereinfachung der Mathematik: Anstelle von sphärischer Geometrie (Bahnlänge auf der Kugeloberfläche) bestimm einfach mal die Länge der Kreissehne zwischen zwei Orten. Wenn der Winkel am Kugelmittelpunkt sehr spitz ist (und das ist er, wenn Städte im Umkreis liegen), machst du dabei nur einen sehr kleinen Fehler, vielleicht kannst du den vernachlässigen.

Die Idee ist gut, so kann ich einiges von dem komplexen Rechenschritt wegfallen lassen. Das schau ich mir mal genauer an, wenn ich wieder ein ganzes Wochenend Zeit dafür habe
--
Gruss
Stefan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.06.2016, 13:48 Uhr
ao

(Operator)



Zitat von Kaffeebart:
Genau so war es gedacht. Ein zusätzlicher Eintrag pro Stadt indem ich direkt die Einwohner im gewünschtem Umkreis eintrage.

Nein, denn diese Zahl ändert sich täglich durch Geburten, Sterbefälle, Umzüge und evtl. anderes. Du müsstest jede Nacht die ganze Datenbank aktualisieren.

Du brauchst die Liste der Städte im Umkreis, die hat höchstens eine Handvoll Einträge, und die Einwohner im Umkreis ermittelst du auf Anfrage durch Aufaddieren.

Und wenn eine Stadt dazukommt oder aufgelöst wird, dann ändern sich halt die Umkreis-Listen aller umliegenden Städte. Aber selbst das ist ne übersichtliche Geschichte, und es passiert vermutlich nur selten.

Es könnte auch helfen, die Städte erst mal ganz grob zu klassifizieren und "Bezirke" zu definieren, sagen wir, 1000 Kilometer im Durchmesser und ein Stück überlappend, damit du keine Orte am Rand verlierst. Um die Umkreis-Liste für die Stadt XY zu bilden, musst du dann nur noch den Bezirk abgrasen, dessen Mittelpunkt nahe an XY liegt, und nicht mehr die ganze Erde.

Oder: Orte, die nach Längen- oder Breitengrad nicht in Frage kommen, gleich auszusortieren und den exakten Abstand erst gar nicht zu berechnen - was interessieren dich Orte in Australien oder Russland, wenn du die Umgebung von Hamburg brauchst?


Zitat:
Deswegen habe ich dennoch initial einmal den enormen Aufwand das für jed Stadt durch zu rechnen.

Stimmt. Darum sagte ich, denk vorher drüber nach, welche Anfragen du an die Datenbank stellen wirst, und optimiere die Struktur, so dass du später das Leben einfacher hast. Beispiel: Einführung der Umkreis-Listen.

Das ist bei Datenbanken oft so, dass sie im Originalzustand nicht so strukturiert sind wie man sie tatsächlich braucht. Das sollte man analysieren und Abhilfe schaffen, bevor der Kram in Betrieb geht, sonst wird man zeitlebens mit schlechter Performance bestraft.

Und wenn du das alles bedacht und geplant hast, dann machst du genau einmal die initiale Aufbereitung der Datenbank, und dann soll das doch lange dauern, wenn es will.


Zitat:
Ist bereits geschehen (siehe weiter oben im 2. Beitrag von mir. Wurde mit PHP geschrieben) .. nach irgendwas um die 3 Wochen Dauerrechnen habe ich etwa 150 - 200 Tausend Städte berechnet. - Daher ist meine Hoffnung, dass man in C doch eine bessere Performance hin bekommt.

Hoffnung ist aber kein gutes Prinzip beim Programmieren. Geh der Sache nach: Warum war die Performance so schlecht? Wo ist die Rechenzeit geblieben? Sind die DB-Zugriffe langsam? Oder die Mathematik? Lief das auf dem Server im Internet, auf dem dir nur ein bestimmtes Kontingent Rechenzeit gehört weil du ihn mit X anderen Kunden teilst?

Aus dem Bauch heraus sagen "ich probiers mal in C" ist jedenfalls kein guter Ansatz, wenn du dafür erst mal ne lange Lernkurve (C, C++, ODBC) vor dir hast.

Dieser Post wurde am 14.06.2016 um 13:56 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.06.2016, 03:15 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von Kaffeebart:

Ok differenzieren wir ich stehe bei C++ nicht ganz bei Null. Habe durchaus schon einzelne Programmteile verarbeitet und zum laufen gebracht.
So steuer ich z.B. diverse Hardware über C++ an.
Das Buch C+ für Spieleprogrammierer von Heiko Kalista habe ich etwa zur Hälfte durch gearbeitet.

Ich behaupte dennoch, dass ich absoluter Anfänger bin - einfach weil ich es nicht wirklich anwende.


dann würde ich sagen, haben wir unterschiedliche Vorstellungen davon, was ein Absoluter Anfänger ist. Darunter verstehe ich nämlich jemanden, der (oder die) vielleicht gerade mal ein "Hello World" auf die Reihe bekommt. - Evtl. kennt diese Person auch schon diverse Konstrukte wie Bedingungen (if) oder Schleifen aus anderen Programmiersprachen, aber noch nicht die Äquivalente in C/C++. Ich gehe bei der Aussage Absoluter Anfänger jedoch auch davon aus, das diese Konzepte noch nicht bekannt sind.


Zitat von Kaffeebart:

Anleitungen von Microsoft finde ich allgemein nicht verständlich. Den Bereich hatte ich mit google zuvor auch schon gefunden aber bin eben nicht schlau draus geworden.


Okay, das passiert mir auch.


Zitat von Kaffeebart:

Ob SQLite für die Aufgabe welche ich meistern muss ausreichend ist wäre die Frage.


Klar muss diese Frage gesondert beantwortet werden. Ich hab das nur erwähnt, weil der Breymann es in seinem Buch als Beispiel verwendet. Wenn das für Deinen Usecase nicht passt, nimmst Du eben MySQL oder was Du sonst vorziehst.


Zitat von Kaffeebart:

Wie eingangs erwähnt habe ich die ODBC Schnittstelle im Projekt bereits einrichten können. Was ich nicht weiss ist wie greife ich auf diese Schnittstelle zu?


Moment. Du schreibst oben was von XAMPP, was eine Hilfe zur Einrichtung ist, wie ich der Wikipedia entnommen habe. Das hat mit ODBC also erst einmal nichts zu tun. Ich hab mir das Video aber auch nicht angesehen, von daher also auch keine Ahnung, ob darin schon von ODBC die Rede ist oder nicht.
Und was die Frage angeht: Das ist wie bei anderen Schnittstellen, bzw. Zusatzbibliotheken: Du bindest im C/C++ code ein oder mehrere zusätzliche Header ein, schreibst also weitere #include <irgendwas> Zeilen an den Anfang. Zusätzlich musst Du dem Linker noch mitteilen, wo die entsprechenden Bibliotheksdateien zu finden sind, also Dateien mit der Endung ".lib". Dazu gibt es Einstellungsmöglichkeiten in Visual Studio. Ich weis aber nicht genau wo, weil ich es selten benutze.
Durch die zusätzlichen #includes hast Du weitere Funktionen zur Verfügung, mit denen Du dann weiter arbeiten kannst. Wie diese Funktionen heissen und wie sie zu benutzen sind, musst Du deren Dokumentation entnehmen.
Dieser Themenbereich, also die Verwendung zusätzlicher Bibliotheken sollte aber auch in dem Buch vom Kallista irgendwo beschrieben stehen. Denn formal betrachtet ist die ODBC-Schnittstelle auch nichts anderes als eine zusätzliche Bibliothek. Hier im Forum gibt es dazu auch die eine oder andere Reihe an Fragen und Antworten.
Soweit diese Antwort, falls Du für das Projekt wieder auf C/C++ zurück greifst.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 15.06.2016 um 03:30 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.06.2016, 11:48 Uhr
Kaffeebart



Hallo Hans und Danke
ja das mit dem absoluten Anfänger schreib ich gern dabei, weil ich bei den anderen Sprachen auch schon gemerkt habe, dass sonst schnell Dinge voraus gesetzt werden die ich einfach noch nicht verstehe.

Habe noch ein wenig weiter gesucht und probiert. Am meisten lerne ich durch Try and Error.
Mit dieser Anleitung bin ich weiter gekommen.
http://zetcode.com/db/mysqlc/

Jetzt habe ich die Verbindung und weiss wie ich MySQL Befehle sende. Damit habe ich genau das was ich angefragt hatte.

Für alle die das Thema hier finden, weil sie etwas ähnliches suchen sei noch dazu gesagt, dass bei en Projekteigenschaften 2 Einträge gemacht werden müssen, dass auch die beiden Header gefunden werden.
Wie diese 2 Einträge zu machen sind ist hier recht gut beschrieben
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/024_c_mysql_004.htm#mj1d6e4ea96b08a0a130d495ab520c98d5

Nochmals vielen Dank Hans und ao
--
Gruss
Stefan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: