Hier möchte ich kurz beschreiben, wie man die MySql Bibliothek(en) und Dll's in einem Visual Studio C++ Projekt benutzen kann.
Vorbereitung:
Wenn man es nicht bereits getan hat, lädt man sich erst einmal die gewünschte MySQL Community Server Version herunter. Es reicht das Zip-Archiv ("Without installer"), welches man in ein beliebiges Verzeichnis entpackt.
Dann schnappt man sich (s)ein Visual Studio Projekt und macht erst einmal drei wesentliche Einstellungen.
1. Man muss dem Compiler mitteilen in welchen Verzeichnissen er die Header-Dateien von MySql finden kann. Dazu geht man in die Projekt-Eigenschaften > Konfigurationseigenschaften > C/C++ > Allgemein und findet dort die Eingabemöglichkeit für Zusätzliche Includeverzeichnisse. Hier gibt man den Ordner an, wo der MySql-Server entpackt bzw. Installiert wurde -bei mir ist das "D:\Develop\3rdparty\MySql"- ergänzt um "\include". Das sollte dann ungefähr so aussehen:
2. Jetzt kommt noch der Linker. Dem müssen wir mitteilen wo er nach extra Bibliotheken suchen kann. Hier gibt man den Ordner an, wo der MySql-Server entpackt bzw. Installiert wurde und ergänzt um "\lib" und abhängig von der Konfiguration(Release/Debug) ergänzt um "\opt" bzw. "\debug". Das sollte dann wieder ungefähr so aussehen:
3. Als letzte Einstellung im Projekt müssen wir angeben welche Bibliothek(en) der Linker noch einbinden soll. Hier gibt es zwei Möglichkeiten. Entweder nimmt man die "libmysql.lib" und erhält später ein Programm welches die "libmysql.dll" benötigt(dynamisches linken), oder man nimmt die "mysqlclient.lib" (statisches linken) und alles nötige wird dem fertigen EXE-File beigefügt.
Wer will, kann natuerlich die benoetigten Bibliotheken auch per Code einfügen. Die Pfade müssen allerdings trotzdem gesetzt werden.
#pragma comment (lib,"mysqlclient") #pragma comment (lib,"wsock32")
Der Schreibkram ;) :
Für C++ brauchen wir mindestens drei Header die wir in die Sourcefiles einfügen wo wir mit MySql etwas machen wollen…
#include "stdafx.h" #include <winsock.h> #include <my_global.h> #include <mysql.h>
Nicht über winsock.h wundern, das brauchen wir sonst kommen *merkwürdige* Fehler.
Jetzt kann es losgehen. Welche Datentypen und Funktionen über die MySql-C-API zu Verfügung stehen, kann man hier nachlesen.
Hier noch ein kleines Beispiel für den Einstieg;
void CTestDlg::OnBnClickedQuerytest()
{
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server = "127.0.0.1";
char *user = "root";
char *password = "test";
char *database = "test";
char query[] = "SHOW VARIABLES";
/* init mysql */
conn = mysql_init(NULL);
/* connect to database */
if ( mysql_real_connect(conn, server, user, password, database, 0, NULL, 0) )
{
/* execute query
mysql_query gibt 0 zurück
wenn alles ok ist
*/
if ( !mysql_query(conn, query))
{
/* Result abholen */
res = mysql_store_result(conn);
/* Result durchlaufen */
while ((row = mysql_fetch_row(res)) != NULL)
{
OutputDebugStringA(row[0]);
OutputDebugStringA("=");
OutputDebugStringA(row[1]);
OutputDebugStringA("\n");
}
/* Result wieder freigeben */
mysql_free_result(res);
}
else
{
OutputDebugStringA("Query failed! ");
OutputDebugStringA(mysql_error(conn));
OutputDebugStringA("\n");
}
}
else
{
OutputDebugStringA("Connection failed! ");
OutputDebugStringA(mysql_error(conn));
OutputDebugStringA("\n");
}
/* close connection */
mysql_close(conn);
}
Randnotizen:
Wie oben beschrieben kann man entweder die libmysql.lib(dynamisches Linken) oder die mysqlclient.lib(stattisches Linken) benutzen. Mir ist allerdings aufgefallen, das beim statischen linken mit der mysqlclient.lib in Visual C++ Memory leaks aufgetreten sind. Wie man die Memory-Leak-Überwachung benutzt/einschaltet steht hier. Wer das liest und weis woran das liegen kann, den bitte ich um ein kurzen Kommentar.



Kommentare