C++ 读取mysql数据库示例
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容: 使用C++ 读取mysql数据库的一般执行过程和预备执行过程简单示例。本次示例中引用的是mysql的64位的数据库;其中依赖的文件可以在我的下载内容中找到 依赖文件链接地址:https://download..net/download/me_test/86506310
示例
普通语句执行
#include "mysql.h" #pragma comment(lib,"libmysql.lib") MYSQL mysql_connect;//数据库连接符 mysql_init(&mysql_connect); if(!mysql_real_connect(&mysql_connect,"127.0.0.1","test","test","test_db",3306, NULL, 0)) const char* s_error = mysql_error(&mysql_connect); //插入语句(删除、更新语句执行方式类似) const char* insert_sql = "insert test_table(f_id,f_name)values(1,"test"); if (mysql_query(&mysql_connect,insert_sql )) const char* s_error = mysql_error(&mysql_connect); //查询语句 MYSQL_ROW mysql_row;//数据库每行结果 MYSQL_RES* mysql_result = NULL; const char* select_sql = "select f_id from test_tale"; if (!mysql_query(&mysql_connect,sql)) { mysql_result = mysql_store_result(&mysql_connect); if (mysql_result) { while((mysql_row = mysql_fetch_row(mysql_result)) { printf("%d ",atoi(mysql_row[0])); } } mysql_free_result(mysql_result); } else{ const char* s_error = mysql_error(&mysql_connect); }
prepare语句执行
如果插入的语句中并不是简单的int或者string类型;而是比较长的字符串或者blob类型。那么就需要使用prepare语句插入blob。 使用这种方式需要注意:由于此方式里面绑定数据使用的都是指针,并没有进行深拷贝,绑定的数据必须要保证在语句执行完毕之前有效。否则的话数据一旦离开有效区间就会被释放,导致执行错误。
#include "mysql.h" #pragma comment(lib,"libmysql.lib") MYSQL mysql_connect;//数据库连接符 mysql_init(&mysql_connect); if(!mysql_real_connect(&mysql_connect,"127.0.0.1","test","test","test_db",3306, NULL, 0)) const char* s_error = mysql_error(&mysql_connect); MYSQL_STMT* stmt = nullptr; stmt = mysql_stmt_init(&database::getSingletonPtr()->get_connection()); if(!stmt)const char* s_error = mysql_error(&mysql_connect); MYSQL_BIND bind[3]; memset(bind,0,sizeof(bind)); //准备插入的语句 const char* insert_sql = "insert into test_tb2(f_id,f_name,f_data)values(?,?,?)"; //插入int类型数据准备 int n_id = 100; bind[0].buffer_type = MYSQL_TYPE_LONG; bind[0].buffer = (char*)&n_id ; bind[0].is_null = 0; bind[0].length = 0; //插入string类型准备 char* str_data = "test data"; unsigned int u_length = strlen(str_data); bind[1].buffer_type = MYSQL_TYPE_STRING; bind[1].buffer = (char*)str_data; bind[1].is_null = 0; bind[1].length = &s_length; //插入blob类型 std::vector<int> vec_value; for(auto i = 0; i < 1000; i++) vec_value.push_back(i); unsigned int b_length = vec_value.size()*sizeof(int); bind[2].buffer_type = MYSQL_TYPE_BLOB; bind[2].buffer = (char*)&vec_value[0]; bind[2].is_null = 0; bind[2].length = &b_length; //准备语句 if (mysql_stmt_prepare(stmt, insert_sql , strlen(insert_sql)) { const char* s_error = mysql_stmt_error(stmt); printf("marker error : %s ", s_error); return; } //绑定数据 if (mysql_stmt_bind_param(stmt, bind)) { const char* s_error = mysql_stmt_error(stmt); printf("marker error : %s ", s_error); return; } //执行语句 if (mysql_stmt_execute(stmt)) { const char* s_error = mysql_stmt_error(stmt); printf("marker error : %s ", s_error); return; } //关闭状态 if (mysql_stmt_close(stmt)) { const char* s_error = mysql_stmt_error(stmt); printf("marker error : %s ", s_error); return; }