MySql in eine dialogbasierende anwendung
-
wie füge ich eine My SQL DAtenbank in eine dialogbasierende Anwedung ein?
-
Hi,
einfach die libmysql.dll verwenden, ist bei MySql dabei. Die "mysql.h" findest Du im "include" Verzeichnis von MySql. Nicht vergessen die "libmysql.lib" in Verzeichnis "lib" von MySql in das Projekt einzubinden. Funktionsbeschreibungen findest Du hier:
http://www.mysql.de/documentation/mysql/bychapter/manual.de_toc.html#C_API_datatypes
Viel Spass
TT
-
Hi,
hier noch einwenig sourcecode:
Lege Dir z.B. eine Datenbank "CTest" an. Dort eine Tabelle "namen" mit z.B. zwei Feldern (Vorname, Nachname). Lege einige Datensätze mit Beispieldaten an. Erstelle eine Dialoganwendung und includiere die mysql.h. Füge die libmysql.lib dem Projekt hinzu. Nun noch ein Editfeld mit ein Membervariable m_Edit1 und ein Button um diese Funktion auszuführen. (die Einstellungen Host und User anpassen!) Nicht vergessen: die "libmysql.dll" in das Verzeichnis
Debug bzw. Release kopieren.
void CMysql_testDlg::OnButton1() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen MYSQL *myData; MYSQL_RES *result; long rows = 0; long fields = 0; MYSQL_ROW Row; unsigned long *laengen; // initialisieren und mit Server verbinden if ( (myData = mysql_init((MYSQL*) 0)) && mysql_real_connect( myData, "localhost", "test", NULL, NULL, 0, NULL, 0 ) ) { // Datenbank selektieren if ( mysql_select_db( myData, "CTest" ) == 0 ) { mysql_query(myData, "SELECT * FROM namen"); // Query ablegen result = mysql_store_result(myData); // Ergebnis in "result" speichern // festellen ob Ergebnis vorhanden ist, bzw. wie gross die Ergebnismenge ist! (wenn nötig) if (result) { rows = (long) mysql_num_rows(result); // die Anzahl der Spalten feststellen (wenn nötig!) fields = mysql_num_fields(result); // die Anzahl der Zeieln feststellen (wenn nötig!) mysql_data_seek(result, 0); // Ergebnis positionieren (Erste Zeile auswählen) Row = mysql_fetch_row(result); // eine Zeile übernehmen (in diesem Fall die Erste) if(Row) { laengen = mysql_fetch_lengths(result); // die Länge der einzelen Felder (Spalten) feststellen m_Edit1.Format("%.*s", (int) laengen[0], Row[0]);// das erste Feld der ersten Zeile in m_Edit1 übernehmen } else { m_Edit1 = "Nix!!!"; } } mysql_free_result(result); } mysql_close( myData ) ; } UpdateData(FALSE); }Das ist nur ein ganz einfaches Beispiel, aber für den Anfang sollte das genügen. Einfach ein wenig damit spielen. MySQL ist wohl die beste Alternative zu rein kommerziellen Datenbanken. Wenn Du die API verwendest und nicht mit ODBC die Datenbank ansprichst, so wie in diesem Beispiel, wird dich die Geschwindigkeit von MySQL umhauen.

Gruß
TT
-
ich hab den source von TT mal ausprobiert..... leider bekomme ich immer 3 fehler...
...\dyfyc\mysql_com.h(115) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'fd'
...\dyfyc\mysql_com.h(115) : error C2501: 'SOCKET' : Fehlende Speicherklasse oder Typbezeichner
...\dyfyc\mysql_com.h(115) : error C2501: 'fd' : Fehlende Speicherklasse oderich habe das projekt mal hier als zip...
wäre supi wenn jemand helfen könnte....
JOat
PS: mir ist klar das der thread etwas alt ist

-
// my_socket fd; /* For Perl DBI/dbd */habe diese zeile oben auskommentiert, dann liefs.. hmm
ps: in der mysql_com.h
(nicht die schöne art, aber wenns sowieso fürs perl ist...)wozu brauchst du das? woher hast du das?
na ja,... so long
-
Man muss die Socketunterstützung einbinden.
#include <afxsock.h> // MFC-Socket-Erweiterungen
-
@unix-tom
stimmt, kompilieren ließ es sich mit meiner variante zwar, aber deine funzt ohne pfusch.
-
Muss es ja das ich bereits seit 5 Jahren mit der API arbeite und meine C++-Wrapper-DLL/Lib-Klasse darauf basiert.

-
soweit funktioniert mein dingens jetzt....
nur will ich das ganze etwas dynamischer machen... (spalten sollen von alleine erstellt werden...)
auch sollte man die tabelle bzw die datenbank wählen können....
leider habe ich zu wenig ahnung...
wäre nett wenn jemand helfen könnte
JOat
-
MYSQL unterstützt SQL-Befehle die nicht Standard sind.
z.B. SHOW Tables
SHOW DATABASESDamit fragt man diese ab.
Du solltest dich schon mit der API befassen wenn du damit arbeiten willst und dich nicht auf Source aus dem Forum verlassen.
Es gibt für bestimmte Dinger auch API-Befehle.(Abfrage der Feldnamen, Abfrage der zurückgelieferten Datensätze,u.s.w.) Wenn man eine Bibliothek (API) verwenden will muss man sich da einlesen.
-
Hi,
ich habe mit Interesse Eure Diskussion verfolgt und sie hat mir sehr weitergeholfen und es hat alles geklappt.
Allerdings möchte ich gerne die Konnektierung in eine Funktion in einer anderen Klasse einkapseln, so dass die die folgenden paar Zeilen nicht immer neu aufrufen muss.
Bisher:
stdfunctions *myFunctions; myFunctions = new stdfunctions; myFunctions->MySQL_Connect(???,"Tabellenname");und . . .
bool stdfunctions::MySQL_Connect(??? myDB,CString Table) { MYSQL *myDB; // <-- ??? if ( (myDB = mysql_init((MYSQL*) 0)) && mysql_real_connect( myDB, "localhost", "test", NULL, NULL, 0, NULL, 0 ) ) { // Datenbank selektieren if ( mysql_select_db( myDB, Table ) == 0 ) { return TRUE; } else { return FALSE; } } else { return false; } }Leider bin ich noch blutiger Anfänger in C++ und weiß daher nicht wie ich den Zeiger (myDB) auf MYSQL übergeben kann / soll.
Meine Frage:
Wie muss ich meine Funktion aufbauen, um MySQL_Connect fehlerfrei nutzen zu können?Danke für Eure Hilfe!
Gruß Marc
-
Lade dir meine Klasse runter. Ist zwar der Source nicht dabei aber es funktioniert für privaten nichtkommerziellen Gebrauch.