文章目录[隐藏]
- 一、代码实现
- 二、数据结构
- 三、获取数据的API
- 1、MYSQL_RES *mysql_store_result(MYSQL *mysql)
- 2、MYSQL_RES *mysql_use_result(MYSQL *mysql)
- 3、MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
- 4、MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
- 5、MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
- 6、void mysql_free_result(MYSQL_RES *result)
一、代码实现
1、若在C++代码中写#include显示该库没安装,就先安装这个库 sudo yum install
mysql-community-devel.x86_64
2、新建myDB.h文件
#include #include #include using namespace std; class MyDB{public: MyDB(); ~MyDB(); bool initDB(string host, string user, string pwd, string db_name); bool exeSQL(string sql);private: MYSQL *connection; MYSQL_RES *result; MYSQL_ROW row;};
3、新建myDB.cpp
#include #include #include #include \"myDB.h\"using namespace std;MyDB::MyDB(){ connection = mysql_init(NULL); // 初始化数据库连接变量 if(connection == NULL) { cout << \"Error:\" << mysql_error(connection); exit(1); }} MyDB::~MyDB(){ if(connection != NULL) // 关闭数据库连接 { mysql_close(connection); }}bool MyDB::initDB(string host, string user, string pwd, string db_name){ // 函数mysql_real_connect建立一个数据库连接 // 成功返回MYSQL*连接句柄,失败返回NULL connection = mysql_real_connect(connection, host.c_str(), user.c_str(), pwd.c_str(), db_name.c_str(), 0, NULL, 0); if(connection == NULL) { cout << \"Error:\" << mysql_error(connection); exit(1); } return true;} bool MyDB::exeSQL(string sql) { cout<<\"——————MYSQL结果——————\"<<endl; if(mysql_query(connection, sql.c_str())) { // mysql_query()执行成功返回0,失败返回非0值 cout << \"Query Error:\" << mysql_error(connection); return false; } else { result = mysql_use_result(connection); // 获取结果集 while(row = mysql_fetch_row(result)) { // 不断获取下一行 vector<string> rowResult; // mysql_num_fields()返回结果集中的列数 for(int j = 0; j < mysql_num_fields(result); ++j) { cout << row[j] << \" \"; } cout << endl; } // 释放结果集的内存 mysql_free_result(result); } cout<<\"——————————————————\"<<endl; return true;}
4、在main文件中测试
void testDB(){ MyDB db; db.initDB(\"localhost\", \"root\", \"0709\", \"EpidemicDatabase\"); db.exeSQL(\"INSERT INTO User VALUES(\\\"452223199707090000\\\", \\\"catnip\\\", \\\"0709\\\", false)\");}
5、在mysql中查看对应的数据库和表格
插入sql执行成功
二、数据结构
1、MYSQL_RES
typedef struct st_mysql_res { my_ulonglong row_count; // 结果集的行数 unsigned int field_count, current_field; // 结果集的列数,当前列 MYSQL_FIELD *fields; // 结果集的列信息 MYSQL_DATA *data; // 结果集的数据 MYSQL_ROWS *data_cursor; // 结果集的光标 MEM_ROOT field_alloc; // 内存结构 MYSQL_ROW row; // 非缓冲的时候用到 MYSQL_ROW current_row; // 当前行。mysql_store_result时会用到 unsigned long *lengths; // 每列的长度 MYSQL *handle; // mysql_use_result会用。 my_bool eof; // 是否为行尾} MYSQL_RES;
2、MYSQL_ROWS
typedef struct st_mysql_rows { struct st_mysql_rows *next; //列表的行 MYSQL_ROW data;} MYSQL_ROWS; //mysql的数据的链表节点。可见mysql的结果集是链表结构
3、MYSQL_DATA
typedef struct st_mysql_data { my_ulonglong rows; unsigned int fields; MYSQL_ROWS *data; MEM_ROOT alloc;} MYSQL_DATA; // 数据集的结构
4、MYSQL_FIELD
typedef struct st_mysql_field { char *name; // 列名称 char *table; //如果列是字段,列表 char *def; //默认值(由mysql_list_fields设置) enum enum_field_types type; //类型的字段。Se mysql_com。h的类型 unsigned int length; //列的宽度 unsigned int max_length; //选择集的最大宽度 unsigned int flags; //Div标记集 unsigned int decimals; //字段中的小数位数} MYSQL_FIELD; //列信息的结构
5、USED_MEM
typedef struct st_used_mem //结构为once_alloc{ struct st_used_mem *next; //下一个块使用 unsigned int left; //记忆留在块 unsigned int size; //块的大小} USED_MEM; //内存结构
6、MEM_ROOT
typedef struct st_mem_root { USED_MEM *free; USED_MEM *used; USED_MEM *pre_alloc; unsigned int min_malloc; unsigned int block_size; void (*error_handler)(void);} MEM_ROOT; //内存结构
三、获取数据的API
1、MYSQL_RES *mysql_store_result(MYSQL *mysql)
(1)通过检查mysql_store_result()是否返回0,可检测查询是否没有结果集。
(2)一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。
(3)可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
(4)一旦完成了对结果集的操作,必须调用mysql_free_result()。
2、MYSQL_RES *mysql_use_result(MYSQL *mysql)
初始化结果集检索
(1)使用mysql_use_result()时,必须执行mysql_fetch_row(),直至返回NULL值,否则,未获取的行将作为下一个检索的一部分返回。
(2)不能对结果集用mysql_data_seek()、mysql_row_seek()、mysql_row_tell()、mysql_num_rows()或mysql_affected_rows(),也不应发出其他查询,直至mysql_use_result()完成为止。(但是,提取了所有行后,mysql_num_rows()将准确返回提取的行数)。
(3)一旦完成了对结果集的操作,必须调用mysql_free_result()
3、MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。
//假设mysql已经连接好MYSQL_RES* result = mysql_store_result(mysql); if (result == NULL) { return;} MYSQL_ROW row;int num_fields = mysql_num_fields(result);while ((row = mysql_fetch_row(result))) { long *lengths = mysql_fetch_lengths(result); for(int i = 0; i < num_fields; i++) { printf(\"[%.*s] \", (int) lengths[i], row[i] ? row[i] : \"NULL\"); } printf(\"/n\");}
4、MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
获取列的信息
(1)重复调用该函数,以检索关于结果集中所有列的信息。无剩余字段时,mysql_fetch_field()返回NULL。
5、MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
取得列的信息
(1)对于结果集,返回所有MYSQL_FIELD结构的数组。每个结构提供了结果集中1列的字段定义。
int num_fields = mysql_num_fields(result);MYSQL_FIELD *fields = mysql_fetch_fields(result);for(int i = 0; i < num_fields; i++) { printf(\"Field %u is %s/n\", i, fields[i].name);}
6、void mysql_free_result(MYSQL_RES *result)
释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。
释放完成后,不要尝试访问结果集。