MySQL Verbindng



  • Hallo liebe C++ Community,
    ich bin gerade dabei ein bisschen mit den Windos Desktop Fenstern "herumzuspielen" und jetzt wollt ich Daten in einer MySQL Datenbank speichern damit ich auf diese in meinen gesamten Heimnetzwerk erreichen kann. Nur bin ich die MySQL Umgebung nur in Php gewohnt und bin bis jetzt auch nicht stark mit externen Libary in Kontakt gekommen. Egal, trotzdem brauch ich jetzt eine externe Libary für die MySQL. Nur kann ich jetzt mit meinem Code nicht auf Daten zugreifen oder überhaupt die Verbindung herstellen. Ich vermute es liegt an den Code oder an einer falsch eingebundenen Libary. Hier der wichtige Code:
    Includes:

    #include "include/mysql/jdbc.h"
    #include "include/jdbc/mysql_driver.h"
    #include "include/jdbc/mysql_connection.h"
    #include "include/jdbc/cppconn/build_config.h"
    #include "include/jdbc/cppconn/config.h"
    #include "include/jdbc/cppconn/datatype.h"
    #include "include/jdbc/cppconn/driver.h"
    #include "include/jdbc/cppconn/exception.h"
    #include "include/jdbc/cppconn/metadata.h"
    #include "include/jdbc/cppconn/parameter_metadata.h"
    #include "include/jdbc/cppconn/prepared_statement.h"
    #include "include/jdbc/cppconn/resultset.h"
    #include "include/jdbc/cppconn/resultset_metadata.h"
    #include "include/jdbc/cppconn/sqlstring.h"
    #include "include/jdbc/cppconn/statement.h"
    #include "include/jdbc/cppconn/variant.h"
    #include "include/jdbc/cppconn/version_info.h"
    #include "include/jdbc/cppconn/warning.h"
    

    Hier Code:

            case WM_COMMAND:
                if (lParam == (LPARAM)hwndButtonPassword)
                {
                    wchar_t  buff[1024];
                    GetWindowTextW(hwndEditPasswort, buff, 1024);
                    wofstream put_in("Documents//passpass.txt", ios_base::out);
                    put_in << buff;
                    put_in.close();
                    wstring ws(buff);
                    string str(ws.begin(), ws.end());
                    try
                    {
                        sql::Driver* driver;
                        sql::Connection* con;
                        sql::Statement* stmt;
                        sql::ResultSet* res;
    
                        driver = get_driver_instance();
                        con = driver->connect("tcp://DOMAIN:3306", "root", "");
                        con->setSchema("DBNAME");
    
                        stmt = con->createStatement();
                        res = stmt->executeQuery("UPDATE list SET Passwort = '" + str + "' WHERE Idx = 1");
    
                        delete res;
                        delete stmt;
                        delete con;
                    }
                    catch (sql::SQLException) {
                        return NULL;
                    }
                }
                else if...
    

    Die Idee ist wenn ich den Knop drücke er den Inhalt des Textfeldes nimmt und damit das Passwort eines Useres mit dem Idx = 1 ändert.
    Vielen dank schon mal im Voraus für die Hilfe!



  • Kann nicht ist keine Fehlerbeschreibung.



  • Das Programm minimiert sich beim Knop drücken und es erscheint VS2019 wieder und in der Zeile 221 (hier 19) wird folgendes angezeigt:

    Unbehandelte Ausnahme bei 0x765744C2 in Programm.exe: Microsoft
    C++-Ausnahme: std::bad_alloc bei Speicherort 0x00B3DF38



    1. Gewöhnt dir das Zusammenbauen der SQL Befehle aus den Benutzereingaben ab. Sonst ist Deine Anwendung anfällig für SQL Injection.
    2. Was hat das JDBC-Zeug hier zu suchen? Es gibt eine ganz normal Bibliothek für MySQL und C bzw. C++.

    In diesem Forum geht es um Standard C++. Wenn Du Fragen zu bestimmten Betriebssystemen und Laufzeitumgebungen hast, gibt es hier spezielle Foren:

    https://www.c-plusplus.net/forum/category/27/winapi
    oder
    https://www.c-plusplus.net/forum/category/69/datenbanken

    LG Martin



  • @Felix Dann hat möglicherweise get_driver_instance einen nullptr zurückgegeben.



  • @mgaeckler Danke für die schnelle Antwort! Die Anwendung ist nur für mich und meinen Bruder gedacht, deshalb denk ich nicht das er SQL Injections verursachtaber an sich hast du vollkommen Recht!
    Zum 2. Ich war mir nicht ganz sicher ob ich diesen Thread in das C++ oder Datenbanken Forum packe da ich dachte das wäre eher ein "C++ Fehler" anstatt eines SQL Fehlers, von mir aus kann ich den Thread aber auch nochmal in Datenbanken tun und diesen hier löschen.
    Ich wäre dir sehr verbunden wenn du mir mein vorhaben für die normale mysql Bibliothek erklärst.

    Lg Felix



  • @mgaeckler Wie kann ich das ändern bzw. was bedeutet diese Return-Statement in diesem Fall?

    Lg Felix



  • @Felix Keine Ahnung. Möglicherweise findet er Deine Javaumgebung nicht. Wie schon geschrieben, verwende die C-Api von MySQL.

    LG



  • Du solltest dir ASAP angewöhnen mit dem Debugger zu arbeiten. Einfach einen Brechpunkt auf Zeile 18 setzen und dann im Einzelschrittmodus weiterspringen und gucken, wie sich deine Variablen verändern.
    Und robust zu programmieren, überall wo ein Zeiger auf iwas zurückgegeben wird besteht prinzpiell die Möglichkeit, dass er null ist und nicht dereferenziert werden darf.



  • Ich nehme an, du hast deinen Code von MySQL Datenbank unter C++ verwenden!?

    Wobei man bei dem Verbindungsaufbau korrekte Daten angeben muss. Dafür müsst ihr DOMAIN, DBUSER, PASSWORD und DBNAME mit euren Daten ersetzen

    Paßt denn der Domainname DOMAIN (dies sollte der Rechnername sein, auf dem der MySql-Server installiert ist) sowie der Datenbankname DBNAME?

    @mgaeckler hat aber Recht, daß der JDBC-Zugriff veraltet ist und man die neuere X DevAPI verwenden sollte, s. Introduction to Connector/C++.



  • @Th69
    Du hast recht, den Code hab ich daher und das war auch falsch hab es jetzt geändert:

                    try
                    {
                        driver = get_driver_instance();
                        con = driver->connect("tcp://localhost:3306", "root", "");
                        con->setSchema("user");
                    }
    

    nur leider ist der Fehler immer noch der gleiche. Ist localhost überhaupt richtig oder sollte ich wirlkich meinen RechnerNamen verwenden. (Benutze Xampp)



  • @Felix sagte in MySQL Verbindng:

    nur leider ist der Fehler immer noch der gleiche.

    Du prüfst immer noch nicht, ob driver ungleich 0 ist. Und für con gilt dann natürlich im nächsten Schritt das gleiche.



  • @manni66
    Meinst du so:

                    try
                    {
                        driver = get_driver_instance();
                        if (driver != 0)
                        {
                            con = driver->connect("tcp://localhost:3306", "root", "");
                            con->setSchema("user");
                        }
                        else
                        {
                            return NULL;
                        }
                    }
                    catch (sql::SQLException) {
                        return NULL;
                    }
    


  • @Felix sagte in MySQL Verbindng:

    Meinst du so:

    Ja. Man könnte natürlich dem Benutzer noch irgendetwas mitteilen, statt einfach nur abzubrechen.



  • Ein simple Frage, warum nutzt Du nicht die C Library von MySQL?


Anmelden zum Antworten