MySQL C ++ Connector bloquea mi aplicación en ResultSet-> getString ()

Soy yo otra vez, probablemente haciendo noob C ++ preguntas

Tuve GRANDES dolores de cabeza haciendo que el maldito (lo siento por el lenguaje) el conector MySQL C ++ funcione. No sé si está mal escrito o algo así, pero para mi experiencia, nunca he tenido tantos problemas para hacer que algo funcione.

De todos modos, lo conseguí para conectar y lanzar excepciones en la conexión / consulta fallida, lo que para mí es bastante importante: U: P. El problema real sale de mí obteniendo el resultado de la consulta. Independientemente de lo que haga, mi aplicación siempre se bloquea: S

Usé el instalador de 32 bits y el libmysql.dll / lib del servidor MySQL de 32 bits (ya que estoy compilando una aplicación de 32 bits, pensé que esto es lo correcto)

Aquí hay un código para que puedas imaginar de lo que estoy hablando.

DBManager.h

#ifndef DBMANAGER_H
#define DBMANAGER_H
#define CPPCONN_PUBLIC_FUNC
#define CPPCONN_LIB_BUILD True

#include <string>
#include "mysql_connection.h"
#include "mysql_driver.h"
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>

class DBManager
{
public:
    static DBManager* Instance();
    bool Query(const char* Query);
    void Connect(const char* DbHost, unsigned short DbPort, const char* DbUser, const char* DbPass, const char* DbName);
    bool ValidCredentials(const char* Username, const char* Password);
    void ManageException(sql::SQLException &e);

    ~DBManager();

protected:
    static DBManager* pInstance;

private:
    DBManager() {};
    DBManager(DBManager const&){};
    DBManager& operator=(DBManager const&){};

    sql::mysql::MySQL_Driver* driver;
    sql::Connection *Con;
    sql::PreparedStatement *pstmt;
    sql::ResultSet *res;
    sql::Statement *stmt;

    bool isConnected;
};

#endif

Y ahora el archivo cppDBManager.cpp

#include "DBManager.h"

DBManager* DBManager::pInstance = NULL;

DBManager* DBManager::Instance()
{
    if (!pInstance)
    {
        pInstance = new DBManager();
    }

    return pInstance;
}

bool DBManager::Query(const char* Query)
{
    return true;
}

DBManager::~DBManager()
{   
    delete Con;
    delete pstmt;
    delete res;
    delete stmt;
}

void DBManager::ManageException(sql::SQLException& e)
{
    if (e.getErrorCode() != 0) {
        std::cout << "# ERR: SQLException in " << __FILE__;
        std::cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << std::endl;
        std::cout << "# ERR: " << e.what();
        std::cout << " (MySQL error code: " << e.getErrorCode();
        std::cout << ", SQLState: " << e.getSQLState() << " )" << std::endl;
    }
}

void DBManager::Connect(const char* DbHost, unsigned short DbPort, const char* DbUser, const char* DbPass, const char* DbName)
{
    try {
        driver = sql::mysql::get_mysql_driver_instance();
        std::string connDSN = "tcp://" + std::string(DbHost) + ":3306";

        Con = driver->connect(connDSN, sql::SQLString(DbUser), sql::SQLString(DbPass));
        Con->setSchema(sql::SQLString(DbName));
        isConnected = true;

        std::cout<<"Database connection successul."<<std::endl;

    } catch(sql::SQLException &e) {
        ManageException(e);
        isConnected = false;

        return;
    }
}

bool DBManager::ValidCredentials(const char* Username, const char* Password)
{
    bool cred = false;

    try {
        pstmt = Con->prepareStatement("SELECT * FROM account WHERE account_name=? LIMIT 1"); // Smart use of indexing
        pstmt->setString(1, Username);
        res = pstmt->executeQuery();

        while(res->next())
        {
            if (res->getString("password") == Password)
            {
                cred = true;
            }
        }
    }
    catch(sql::SQLException &e) {
        ManageException(e);
        return false;
    }

    return cred;
}

Básicamente, se compila sin problemas, se conecta sin problemas, ejecuta consultas sin problemas, pero en el segundo intento recuperar datos, se genera una excepción de punto de interrupción en un archivo "xutils.cpp". Realmente no tengo idea de lo que estoy haciendo mal. Estoy usando las bibliotecas DEBUG mientras compilo para la depuración. Hmm libmysql.dll debería publicarse ya que lo extraje del paquete del servidor, pero no parece encontrarlo como una fuente para compilar el mío.

Realmente no tengo idea de por qué se bloquea y se quema así: /

PD: No me importa que no haya hash de la contraseña, en realidad es solo una prueba de concepto para mí, para que ... primero funcione, luego se asegure: U

PD: También tengo bibliotecas Boost compiladas y listas en el proyecto, si eso ayudara: U

EDITAR: Función principal

bool ServerRunning = true;
int main(int argc, char** argv)
{
    #ifdef _WIN32
        std::string title = TEXT("Window Title Change");
        SetConsoleTitle(title.c_str());
    #endif;

    std::cout<<"Loading Configuration File..."<<std::endl<<std::endl;

    std::string path = boost::filesystem::path(boost::filesystem::current_path()).string();
    path += "\\Config.ini";

    INIParser* Config = new INIParser(path.c_str()); //MinINI

    // Sockets data
    std::string listenIP = Config->GetString("Network", "ListenIP", "127.0.0.1");
    unsigned short listenPort = Config->GetInt("Network", "ListenPort", 5000);

    // Database data
    std::string dbHost = Config->GetString("Database", "Host", "localhost");
    std::string dbUser = Config->GetString("Database", "User", "root");
    std::string dbPass = Config->GetString("Database", "Password", "");
    std::string dbName = Config->GetString("Database", "Database", "authserv");
    unsigned short dbPort = Config->GetInt("Database", "Post", 1000);

    // General settings
    int sessionTimeout = Config->GetInt("Settings", "SessionTimeout", 10);
    int maxClients = Config->GetInt("Settings", "MaxClients", 10);
    int serverTimeout = Config->GetInt("Settings", "GameserverTimeout", 1);

     // Begin Initialization
     DBManager::Instance()->Connect(dbHost.c_str(), dbPort, dbUser.c_str(), dbPass.c_str(), dbName.c_str());
     bool loginSuccess = DBManager::Instance()->ValidCredentials("Username", "Password");

    char c;
    while (ServerRunning)
    {
        std::cin>>c;

        if (c == 'q')
        {
            ServerRunning = false;
        }
    }

    return 0;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta