说是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: 代表一个数据库连接的句柄
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;
MYSQL_FIELD:包含各字段(列)的信息
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;
MYSQL_ROW:通俗的讲就是查询结果集(MYSQL_RES)的一行数据
typedef char **MYSQL_ROW;/* 返回的每一行的值,全部用字符串来表示*/
示例:
#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; }