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 oder

    ich 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...

    download

    wäre nett wenn jemand helfen könnte

    JOat



  • MYSQL unterstützt SQL-Befehle die nicht Standard sind.

    z.B. SHOW Tables
    SHOW DATABASES

    Damit 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.


Anmelden zum Antworten