example c++ mysql c++11 clion

c++ mysql example



Conectando a MySQL en C++ (2)

Puede usar la biblioteca mysql ++ para conectarse a mysql desde c ++.
Para eso instale mysql ++,
( Ubuntu )

sudo apt-get install mysql-server mysql-client sudo apt-get install libmysqlclient-dev libmysql++-dev libmysqlcppconn-dev

( Mac )

brew install mysql++

incluir la biblioteca mediante la adición,

/usr/include/mysql++ /usr/include/mysql

y añadir enlazadores,

-lmysqlpp -lmysqlclient

Código de ejemplo ,

#include <iostream> #include <string> #include <mysql++.h> #include <mysql.h> #define dbname "dbname" #define server "localhost" #define user "username" #define pass "password" using namespace std; using namespace mysqlpp; int main() { Connection con(true); try { con.connect(dbname, server, user, pass); cout << "Connected to database/n"; string s = "SELECT * FROM mirrors_mee WHERE id=1"; Query q = con.query(s); StoreQueryResult sq = q.store(); StoreQueryResult::iterator it; it = sq.begin(); while (it != sq.end()) { Row row = *it; cout << row[5] << " " << row[6] << " " << row[7] << endl; it++; } } catch (Exception &e) { cout << e.what() << endl; } return 0; }

Obtendrá la documentación completa de la biblioteca here .

Estoy tratando de aprender C ++ y estoy teniendo un poco de pesadilla haciendo una prueba en la que me conecto a una base de datos MySQL.

Tuve problemas con el conector de MySQL que no se vinculaba correctamente y luego relocation truncated to fitr_x86_64_32 against symbol problemas relacionados con la relocation truncated to fitr_x86_64_32 against symbol .

Creo que lo he arreglado al agregar una marca de compilador y ahora la aplicación se construye y enlaza con éxito.

Cuando ejecuto la aplicación, llega a llamar a get_driver_instance pero luego se cierra. No se produce ninguna excepción, no hay errores, nada sale del código 0.

A continuación se muestra mi clase DBManager

#include "DBConnectionManager.h" using namespace std; DBConnectionManager::DBConnectionManager() { cout << "Starting DBConnectionManager - Updated" << endl; try { cout << "Getting driver instance" << endl; driver = get_driver_instance(); cout << "Got driver instance" << endl; conn = driver->connect("tcp://127.0.0.1:3306", "root", "password"); conn->setSchema("bugs"); cout << "Connected to database" << endl; } catch (SQLException ex) { cout << "Error connecting to DB: " << ex.what() << endl; } catch (...) { cout << "Something has gone wrong" << endl; } }

A continuación se muestra el archivo de cabecera

#ifndef MYSQLTEST_DBCONNECTIONMANAGER_H #define MYSQLTEST_DBCONNECTIONMANAGER_H #include <driver.h> #include <exception.h> #include <resultset.h> #include <statement.h> using namespace sql; class DBConnectionManager { private: sql::Driver *driver; sql::Connection *conn; sql::Statement *statement; sql::ResultSet *res; public: DBConnectionManager(); void performSql(); }; #endif //MYSQLTEST_DBCONNECTIONMANAGER_H

A continuación se muestra mi método principal.

#include "DBConnectionManager.h" int main() { DBConnectionManager dbConnectionManager; dbConnectionManager.performSql(); return 0; }

A continuación se encuentra mi archivo CMakeLists.txt

cmake_minimum_required(VERSION 3.6) project(MySQLTest) include_directories("C://Program Files//MySQL//MySQL Connector C++ 1.1.7//include//cppconn" "C://Program Files//MySQL//MySQL Connector C++ 1.1.7//lib//opt") SET(GCC_COVERAGE_LINK_FLAGS "-m64 -Wl,--image-base -Wl,0x10000000 -lpthread -pthread") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -m64 -Wl,--image-base -Wl,0x10000000 -lpthread -pthread ") set(SOURCE_FILES main.cpp DBConnectionManager.cpp) add_executable(MySQLTest ${SOURCE_FILES}) add_library(mysqlcppconn.lib) set_target_properties(MySQLTest PROPERTIES LINKER_LANGUAGE CXX) set_target_properties(mysqlcppconn.lib PROPERTIES LINKER_LANGUAGE CXX) target_link_libraries(MySQLTest "C://Program Files//MySQL//MySQL Connector C++ 1.1.7//lib//opt//mysqlcppconn.lib")

Cuando creo la instancia de mi clase DBConnectionManager , llama a la consulta con éxito e imprime. Starting DBConnectionManager - Updated seguido de Getting Driver Instance pero luego Process finished with exit code 0 sin pistas sobre lo que salió mal.

Actualizar

Finalmente estoy llegando a alguna parte. Descubrí que hay algunas bibliotecas de cliente MySQL dentro de Cygwin, así que las descargué y las mencioné en el archivo cmake.

Mi archivo cmake ahora se ve así:

cmake_minimum_required(VERSION 3.6) project(MySQLTest) SET(CPPCONN_PUBLIC_FUNC=) SET(GCC_COVERAGE_LINK_FLAGS "-g -m64 -DCPPCONN_PUBLIC_FUNC= -Dmysqlcppconn_EXPORTS -lpthread -pthread -Wl,--image-base -Wl,0x10000000 -lz") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCPPCONN_PUBLIC_FUNC= -Dmysqlcppconn_EXPORTS -std=c++11 -g -m64 -Wl,--image-base -Wl,0x10000000 -lpthread -pthread -lz") include_directories("C:/mysql_connector/include") include_directories("C:/boost_1_61_0") set(BOOST_INCLUDE_DIR C:/boost_1_61_0) set(BOOST_LIBRARY_DIR C:/boost_1_61_0/libs) set(SOURCE_FILES main.cpp DBConnectionManager.cpp) add_executable(MySQLTest ${SOURCE_FILES}) find_package(Boost COMPONENTS REQUIRED) link_directories(C:/mysql_connector/lib) target_link_libraries(MySQLTest "C:/mysql_connector/lib/mysqlcppconn.dll" "C:/Program Files/MySQL/MySQL Server 5.7/lib/libmysql.dll" "C:/mysql_connector/lib/libmysqlclient.dll.a" "C:/mysql_connector/lib/libmysqlclient_r.dll.a" ${Boost_LIBRARY_DIR})

Observe cómo he vinculado las bibliotecas libmysqlclient.dll.a y libmysqlclient_r.dll.a, que es lo que obtuve de Cygwin.

Cuando ejecuto la aplicación ahora, obtiene con éxito la instancia del controlador y se envía a la consola

Starting DBConnectionManaged - Updated Getting driver instance Got driver instance

Pero cuando intento conectarme con el controlador-> conectar, obtengo el siguiente error

0 [main] MySQLTest 2976 C:/Users/Chris/.CLion2016.2/system/cmake/generated/MySQLTest-8702ae13/8702ae13/Debug/MySQLTest.exe: *** fatal error - Internal error: TP_NUM_C_BUFS too small: 50

Cuando lo puse a través del depurador, falla en el controlador-> conectar con

gdb: unknown target exception 0xe06d7363 at 0x7fff11347788 Program received signal ?, Unknown signal. 0x00007fff11347788 in RaiseException () from /cygdrive/c/WINDOWS/System32/KERNELBASE.dll

Actualización 2

Todo lo que he leído señala que los binarios del conector mysql deberían funcionar bien, así que comencé de nuevo. A continuación se muestra el contenido de mi archivo cmake.

cmake_minimum_required(VERSION 3.6) project(MySQLTest) #add_compile_options("-v") SET(GCC_COVERAGE_LINK_FLAGS ) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(BOOST_INCLUDE_DIR C:/boost_1_61_0) set(BOOST_LIBRARY_DIR C:/boost_1_61_0/libs) include_directories("C:/Program/ Files/MySQL/MySQL/ Connector/ C++/ 1.1.7/include" "C:/Program/ Files/MySQL/MySQL/ Connector/ C++/ 1.1.7/include/cppconn" ${BOOST_INCLUDE_DIR}) set(SOURCE_FILES main.cpp DBConnectionManager.cpp) add_executable(MySQLTest ${SOURCE_FILES}) find_package(Boost COMPONENTS REQUIRED) link_directories(C:/Program/ Files/MySQL/MySQL/ Connector/ C++/ 1.1.7/lib/opt) target_link_libraries(MySQLTest C:/Program/ Files/MySQL/MySQL/ Connector/ C++/ 1.1.7/lib/opt/mysqlcppconn.lib ${Boost_LIBRARY_DIR})

Ahora cuando compilo me sale el error original

C:/Program Files/MySQL/MySQL Connector C++ 1.1.7/lib/opt/mysqlcppconn.lib(mysqlcppconn.dll.b):(.text+0x2): relocation truncated to fit: R_X86_64_32 against symbol `__imp_get_driver_instance'' defined in .idata$5 section in C:/Program Files/MySQL/MySQL Connector C++ 1.1.7/lib/opt/mysqlcppconn.lib(mysqlcppconn.dll.b)

A mí me parece que mi aplicación se está compilando como 32 bits en lugar de 64 bits. Como prueba ejecuté el siguiente código:

cout << "Int size is: " << sizeof(int) << endl;

El código anterior imprime 4 (no debería ser 8 si se compiló como 64 bits).

Si mi razonamiento es correcto, ¿por qué no lo compila como de 64 bits? He intentado establecer el indicador del compilador -m64 pero no hace ninguna diferencia. También he instalado el Cygwinx64 que CLion está utilizando.


Puedes usar MySQL Connector C ++

Así es como se configura utilizando Cmake.

cmake_minimum_required(VERSION 3.7) project(projectname) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

Incluya los directorios donde extrajo el mysql-connector-cpp - download

include_directories(/usr/local/include/mysql-connector-cpp/include)

Crea una variable cmake que contenga los archivos fuente del proyecto.

set(SOURCE_FILES main.cpp)

Crea tu ejecutable

add_executable(projectname ${SOURCE_FILES})

Enlace después de crear ejecutable

target_link_libraries(projectname mysqlcppconn)

Tu CMakeList debería tener al menos esto o verse así en este orden

cmake_minimum_required(VERSION 3.7) project(projectname) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") include_directories(/usr/local/include/mysql-connector-cpp/include) set(SOURCE_FILES main.cpp) add_executable(projectname ${SOURCE_FILES}) target_link_libraries(projectname mysqlcppconn)