# Zugriff auf MySQL Datenbank



## Sinac (12. August 2003)

Ahoihoi!

Hierm, hat schonmal jemand eibn C++ Programm geschrieben, das auf eine MySQL Datenbank zugreift?
Ich probier sowas grade, aber das ***** alles hinten und vorne nicht mit dem Datenbankzugriff!
Hab mir mal die tolle API für C++ von der MYSQL Site gezogen, aber die bringt mich nicht wirklich weiter, weil ich nicht mal die laufenden Exampels von MyAQL++ zum laufen kriege!
In den Projekten die dabei sind sind andauerd fehler und includes fehlen und sowas.

Hat das schonmal jemand gemacht oder weiß wo ich vernünftige Infos drüber finde?
Die Suche und Google ham mich net wirklich weiter gebracht! 

Greetz...
Sinac


----------



## bsdxroot (26. August 2003)

Jo, erst mal Datenbanktreiber einrichten.

--> Start --> Einstellungen --> Systemsteuerung --> Verwaltung --> Datenquellen (ODBC)

da gibts ne menge, wirst dich zwangsläufig drin einlesen müssen.

Im Source ansich sind CRecordset für die Abfragen und
CDatabase für die Verbindungsherstellung schon mal sehr ratsam.

ich geh mal davon aus dass du unter windows entwickelst, da ist zu den 2 o.g
Begriffen die F1-Taste extrem hilfreich. ;-)

Wenn du eine konkrete Source haben möchtest, sag eben bescheid.


----------



## Sinac (26. August 2003)

Ich wollte das ganze (versuchen) mehr oder weniger Plattformunabhängig zu gestatllten. Schon klar das das nicht 100% geht, aber schon das ich nich gleich den kompletten Code für Linux neu schreiben muss! Bis jetzt läuft auch alles uter der Konsole und ist auch für  Linux kompilierbar!
Das mit der ODBC wollte ich eigentlich eh vermeiden, das soll doch etwas langsam sein, oder?
Greetz...
Sinac


----------



## Terrance & Philipp (26. August 2003)

Ja ODBC ist langsamer. Ich habe es vor einem Weilchen auch mal versucht mir der mysql++ API, habs aber nicht hingekriegt. Soviel ich weiss, lauten die Befehle gleich wie die Befehle in PHP. Jedoch muss man sich ein paar structs selber zusammenbasteln. *keinplanhab*


----------



## chibisuke (10. September 2003)

also die MySQL++ lib benutzt die streamclasses aus den template librarys.. das benutzt man so in etwa das man sagt db << "SELECT *".... naja alternativen gibts genug...

benutz die MySQL Client lib für ANSI C... die is um einiges einfacher zu bedienen als MySQL++... ich hab auch vor kurzem dafür eine wraper klasse geschrieben für ein projekt von mir...es is relativ einfach...

wenn ihr die client lib nich gleich findet.. die steckt beim sourcecode von MySQL dabei, anders kann man die net bekommen (außer man klaut die wie ich von PHP)

ich würde dir die DLL liebend gern an den post dran hängen aber alleine die client lib hatt n halbes MB...
naja ich zip mal eben die source dateien des wrapers, dann müsstest du eigendlich selbst damit klar kommen (einfach einfügen und die mysql clinet lib für C dazu linken)

das ding wurde ursprünglich dazu entworfen als DLL kompiliert zu werden, und für einen gameserver für mein aktuelles projekt zu funktionieren (Chimera-Crystals - MMO-RPG) daher auch die klassennamen...

anwenden tuste die indem du zuerst das objekt erstellst...
CCMySQL* db = new CCMySQL(<server>, <username>, <passwort>, <port>, [<db>] );
wobei <db> optional is...

du kannst auch den default construktor benutzen new CCMySQL(); in dem fall musst du dann die connect methode aufrufen.

wenn du keine DB angegeben hast, rufst du jetzt db->SelectDB(<db>) auf...

und dann kannst du mit db->query(<querystring>) die datenbank abfrage senden, wenn results dabei sind, also SELECT oder so, dann kannst du while(db->nextRow) einfach die reihen durchgehen... und mit db->getEntry(<name/ID>) kannst du die daten bekommen, entweder den namen als char* oder die ID als int angeben...


natürlich kannst du auch auf den wraper verzichen und die client lib direkt benutzen.. wie das funktioniert zeigt aber dieser wrapper sehr schön.



und nun noch zu der idee mit ODBC... wenn der MySQL server MyODBC nicht unterstützt oder der MyODBC treiber nicht installiert ist, bringt euch das ganze überhaupt nix... wir reden immerhin von MySQL und nicht MSSQL...


----------



## bytef (16. September 2003)

hi leute,


also es existiert eine lösung. Leider habe ich es ermasselt :-( 
ich hatte vor einiger zeit eine seite gefunden die mit einer GNU General Public License (GPL) zwei bibliotheken bereit gestellt hat. Man musste die bibliotheken einbinden, Verzeichnis mit der datenbank in source verzeichnis kopieren und das wars. kein mysql server start nötig, kein mysqlclient von mysql nötig. 
leider hatte ich ein komputer crush und alles ging verloren. seit 4 tagen suche ich nech der seite wieder. vorher habe ich sie durch zufall gefunden (wie das so ist - du findest in der suchmaschine immer das was du gerade nicht suchst) aber ich gebe nicht auf vielleicht weiss jemand von euch wo man solche sachen findet?

auf jeden fall, wenn ich es wieder finde sag ich euch bescheid.

cu
bytef


----------



## Terrance & Philipp (16. September 2003)

Klingt eigentlich ganz interessant, nur glaube ich nicht so an die Performance dieser Lösung. Den mysqlclient (Server) die Abfrage machen zu lassen wird wahrscheinlich schneller sein.


----------



## NBOne (10. Mai 2004)

*Yo*

Ich bin gearde dabei eine Anwendung zu schreiben die mit CDatabase und CRecordset auf eine MySQL Datenbank zugreift, es funktioniert auch alles wunderbar, bis auf die Sortierung. Egal ob ich diese in die SQL Abfrage per "ORDER BY" angebe oder sie in die m_strSort des Recordsets Objekt vor dem ausführen des Querys (mit der Open Methode) lege, die Sortierung wird ignoriert. Hat jemand eine Idee woran das ligen kann? 

Achja, da fällt mir noch ein: Ich muss die Open Methode mit CRecordset::forwardOnly, wieso geht das denn nicht mit Snapshot, liegt das an MySQL?

Danke und tschüss


----------



## michaelwengert (10. Mai 2004)

*Sortieren*

Bei mir hat das sortieren so funktioniert.
m_pSet(Close)		                     //Datenmenge schließen
m_pSet->m_strSort = „FeldName“	                     //sortieren nach „Feldname“
m_pSet->m_Open()		                     //Datenmenge öffnen
UpdateData(FALSE)			//Anzeige aktualisieren


----------



## NBOne (13. Mai 2004)

*Hmm*

Danke für deine Antwort, aber ich mach doch so ziemlich dassselbe und es klappt nicht, ich poste hier einfach mal den Code, ich hoffe es kann mir jemand weiterhelfen. Also wie gesagt, die Sortierung wird einfach ignoriert, egal ob ich sie wie in dem Beispiel hier zuerst durch die m_strSort setze oder per ORDER BY in meinen Query aufnehme, woran kann das liegen?

void CAuftraegeDlg::bookinglist_refresh()
{
	//Deklarationen
	CRecordset rcsRecordset;
	CString strBookId;
	CString strKdnr;
	CString strStatusId;
	CString strPayId;
	CString strDatetime;

	//Recordset initialisieren
	rcsRecordset.m_pDatabase = m_dbDatabase;

	//Sortierung setzen
	rcsRecordset.m_strSort = "dti_datetime";

	//Query ausführen
	rcsRecordset.Open(CRecordset::forwardOnly, _T("SELECT * FROM shop_booking_properties"), CRecordset::executeDirect);


	//Ergebnisse in Liste schreiben
	do
	{
		//Felder auslesen
		rcsRecordset.GetFieldValue("book_id", strBookId);
		rcsRecordset.GetFieldValue("str_kdnr", strKdnr);
		rcsRecordset.GetFieldValue("stat_id", strStatusId);
		rcsRecordset.GetFieldValue("pay_id", strPayId);
		rcsRecordset.GetFieldValue("dti_datetime", strDatetime);

		//Daten in Liste schreiben
		m_lstAuftraege.AddString(strBookId + "      " + strKdnr + "      " + strDatetime + "      " + strStatusId + "      " + strPayId);

		//Nächster Datensatz
		rcsRecordset.MoveNext();

	} while (!rcsRecordset.IsEOF());

}


Danke, 


NBOne


----------

