Lee las últimas noticias

Hola a todos,

Como ya expliqué en el post anterior de cómo conectar una aplicación de Visual C++ con una base de datos MySql, hoy voy a poner el código fuente que he utilizado para realizar una consulta SELECT sobre la base de datos. El resultado de la consulta lo almacena en una variable de tipo string que es devuelta por el método que me he creado.

En el código hay que aclarar algunas cosas:

    • El parámetro de entrada es de tipo stringstream ya que se utiliza una variable de este tipo para crear la consulta cogiendo parametros de otra clase. Por ejemplo, para saber el ID (atributo auto incremental que es la clave primaria de mi tabla cliente) asociado un DNI, realizo lo siguiente:

stringstream cons;

cons << "SELECT ID FROM particular WHERE DNI LIKE '" << c->getDNICIF() << "'";

    •  Separo las sentencias dónde puede haber un valor NULL en varios bloques try catch para identificar los errores (y en español) de cada trozo del código que luego, en caso de producirse, se muestran con un MessageBox (se le podría meter también e.message() pero saldría en inglés).
    • Los parámetros de conexión a la base de datos (host, nombre de la base de datos, usuario y contraseña) son atributos de mi clase Conexion que se obtienen en el constructor de dicha clase mediante la llamada a la única instancia de una clase diseñada con el patrón Singleton, que es la que almacena dichos valores.
    • Este método sólo sirve para cuando la consulta SELECT devuelve un único registro. En el momento que devolviese más de uno yo utilizo una TListaDinamica<string> para almacenar todos los registros y así no perder resultados. En otro post, explicaré cómo hacerlo más en detalle y también cómo recopilar varios atributos de la tabla. La consulta que sirve para obtener el campo que interesa es:

resultado = res->getString(1).c_str();

Espero que esto os haya ayudado y aquí tenéis el código:

/*Ejecuta  una consulta SELECT e introduce los resultados en un string*/
string Conexion::ConsultaSelect(const stringstream& consulta){
    // Punteros para establecer la conexión, crear la consulta y obtener los resultados
    sql::Driver     *driver; // Create a pointer to a MySQL driver object
    sql::Connection *con;
    sql::Statement *stmt;
    sql::ResultSet *res;
    string resultado;
    
    //Intenta obtener un controlador para conectar con el sistema gestor de base de datos
    try{
    driver = get_driver_instance();
    }catch(sql::SQLException e){
        System::Windows::Forms::MessageBox::Show("No se pudo obtener el controlador de la base de datos","Error",
            MessageBoxButtons::OK, MessageBoxIcon::Error);
    }
    //Intenta conectar con la base de datos
    try{
        //con = driver->connect(_servidor.c_str(),_usuario.c_str(),_password.c_str());
        con = driver->connect(_servidor.c_str(),_usuario.c_str(),_password.c_str());
        stmt = con->createStatement();
    }catch (sql::SQLException e){
        System::Windows::Forms::MessageBox::Show("No se pudo conectar a la base de datos","Error",
            MessageBoxButtons::OK, MessageBoxIcon::Error);
    }
    //Intenta ejecutar la consulta en la base de datos
    try{
        //stmt->execute(_bbdd.c_str());
        stmt->execute(_bbdd.c_str());
        string query = consulta.str();
        res = stmt->executeQuery(query.c_str());
    }catch (sql::SQLException e){
        System::Windows::Forms::MessageBox::Show("No se ha podido ejecutar la consulta","Error",
            MessageBoxButtons::OK, MessageBoxIcon::Error);
    }
    //Mientras que haya resultados
    while (res->next()) {
    // You can use either numeric offsets...
    //cout << "id = " << res->getInt(1); // getInt(1) returns the first column
    // ... or column names for accessing results.
    // The latter is recommended.
    //cout << ", label = '" << res->getString("label") << "'" << endl;
        resultado = res->getString(1).c_str();
    }

    //Limpio los recursos utilizados
    delete res;
    delete stmt;
    delete con;
    //Devuelvo la lista con los resultados
    return resultado;
}

CONSENTIMIENTO COOKIES

Utilizamos cookies propias y de terceros para mejorar nuestros productos y servicios mediante el análisis de sus hábitos de navegación. Al aceptar el presente aviso entendemos que das tu consentimiento a nuestra Política de Cookies. Saber más

Acepto