说是C++下的MySQL编程,其实用的还是MySQL自带的C API,因为在我学习的一份游戏的C++源代码中,就是直接使用的C API,还有一份是基于C++封装的MySQ++ API包,这个我还不了解,以后有时间研究一下。
在对MySQL的操作中,主要需要熟悉几个API,这里我总结了一下我遇到的常用的API以及对应的数据结构,最后举一个例子表明这些API的使用。
常用MySQL API
- MYSQL* mysql_init(MYSQL* mysql)//连接句柄,必须初始化之后才能使用
- MYSQL* mysql_real_connect(MYSQL* mysql, const char* host, const char*user, const char* passwd, const char* db, unsigned int port, const char* unix_socket, unsigned long client_flag) //连接数据库,
- int mysql_query(MYSQL* mysql, const char* query) //查询函数,成功返回零,否则返回错误类型非零值。
- const char* mysql_error(MYSQL* mysql) //返回最近一次调用失败的错误消息(返回的是字符串消息)
- unsigned int mysql_errno(MYSQL* mysql) //返回最近一次调用失败的错误代号(返回的是数字代号)
- MySQL_RES* mysql_store_result(MYSQL* mysql) //将数据库中查询(mysql_query)得到的结果(集合)存放在MySQL_RES结构中
- unsigned int mysql_num_fields(MYSQL_RES* res) //返回结果集中的列的数目
- MYSQL_ROW* mysql_fetch_row(MYSQL_RES* res) //返回结果集(MYSQL_RES)的当前行的结果
- unsigned int mysql_num_rows(MYSQL_RES* res) //返回结果集中的行的数目
- unsigned long* mysql_fetch_lengths(MYSQL_RES* res) //返回结果集中各列的长度(可用于字符串拷贝,代替strlen函数)
- void mysql_close(MYSQL* mysql) //数据库使用完毕之后应该进行关闭
相关数据结构
MYSQL: 代表一个数据库连接的句柄
- <strong><span style="font-size:14px;">MYSQL_RES</span></strong>:代表查询结果集,数据结构如下
- 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;
- <strong><span style="font-size:14px;">MYSQL_FIELD</span></strong>:包含各字段(列)的信息
- typedef struct st_mysql_field {
- char *name;/* Name of column */
- char *table; /* Table of column if column was a field */
- char *def; /* Default value (set by mysql_list_fields) */
- enum enum_field_types type; /* Type of field. Se mysql_com.h for types */
- unsigned int length; /* Width of column */
- unsigned int max_length; /* Max width of selected set */
- unsigned int flags; /* Div flags */
- unsigned int decimals; /* Number of decimals in field */
- } MYSQL_FIELD;
- <strong><span style="font-size:14px;">MYSQL_ROW</span></strong>:通俗的讲就是查询结果集(MYSQL_RES)的一行数据
- typedef char **MYSQL_ROW;/* 返回的每一行的值,全部用字符串来表示*/
示例:
- <pre name="code" class="cpp">#include <iostream>
- #include <string>
- using namespace std;
- int main()
- {
- MySQL *mysql;
- mysql = mysql_init(mysql);
- if(!mysql_real_connect(mysql, "localhost", "root", "", "test", 0, NULL, 0))/*针对的是本地数据库且无密码的情况*/
- {
- cout << "Failed to connect to database. ERROR: "<<mysql_error(mysql) <<endl;
- exit(1);
- }
- const char* query = "SELECT * FROM road"
- if(!mysql_query(mysql, query))
- {
- cout << "Failed to query data "<<endl;
- exit(1);
- }
- MYSQL_RES res;
- MYSQL_ROW row;
- int numField = 0;
- unsigned long *len = NULL;
- char data[MAX_ROW][MAX_DATASIZE];
- if(res = mysql_store_result(mysql))
- {
- numField = mysql_num_fields(res);
- int j = 0;
- while(row = mysql_fetch_row(res))/*最好加上范围判断,防止溢出,此处省略*/
- {
- len = mysql_fetch_lengths(res);
- for (int i = 0; i < numField; i++)
- {
- bcopy(row[i], &data[j][i*32], len[i]); /*len[i]在数据拷贝中很方便*/
- }
- j++;
- }
- }
- return 0;
- }</pre>
- <pre></pre>
- <pre></pre>
- <pre></pre>