执行SQL语句
提供了两种接口
如果有包含特殊字符,要以第一个来。他提供了数据的长度,可以包含'\0'这样的字符
而对于第二种接口,如果中间出现类似的'\0'字符,就直接认为字符串结束
//可能会出现 Commands out of sync; you can't run this command now. 这是因为调用了接口之后没有进行获取结果集和清理结果集的操作。
int mysql real_query(MYSQL *mysql, const char*stmt_str, unsinged long length)
//下面这个接口不能有二进制数据
int mysql_query(MYSQL *mysql, const char*stmt_str)
获取结果集:MYSQL_RES
两种接口
在后续的处理中,希望能够通过API去对MYSQL_RES
结构体内的数据进行访问,这样一来对数据的访问更加安全,二来也是考虑到线程安全的问题
//这个接口只是说要开始读了,但不是真实地读。真正地操作在遍历结果集的时候进行,因此速度更快
MYSQL_RES *mysql_use_result(MYSQL *mysql)
//这个接口在使用的使用时真的在读。在使用的时候需要考虑缓冲的大小,内存是有限的,不能无限读
MYSQL_RES *mysql_store_result(MYSQL *mysql)
//在缓冲大小上面有max_allowed_packet,默认是64MB
max_allowed_packet
//可以使用mysql_options来更改,关键字是
MYSQL_OPT_MAX_ALLOWED_PACKET
遍历和清理结果集
unsigned long *mysql_fetch_lengths(MYSQL_RES *result)
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
void mysql_free_result(MYSQL_RES *result)
unsigned long *mysql_fetch_lengths(MYSQL_RES *result)
返回一个数据,知道每一列数据的长度MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
读出来的信息都是以字符串的形式,包括int。
代码汇总
//初始化mysql上下文
MYSQL mysql;
//单线程模式 mysql_init自动调用 mysql_library_init 线程不安全
mysql_init(&mysql);
const char *host = "127.0.0.1";
//const char *host = "192.168.0.203";
const char *user = "root";
const char *pass = "0.0294";
const char *db = "mysql"; //数据库名称
if (!mysql_real_connect(&mysql,host, user, pass, db, 3306, 0, 0))
{
cout << "mysql connect failed!" << mysql_error(&mysql) << endl;
}
else
{
out << "mysql connect success!" << endl;
}
//user select * from user
// 1 执行SQL语句
const char *sql = "select * from user";
// mysql_real_query sql语句中可以包含二进制数据
// mysql_query sql语句中只能是字符串
// 0返回表示成功
int re = mysql_real_query(&mysql, sql, strlen(sql));
// Commands out of sync; you can't run this command now
// 执行sql语句后,必须获取结果集并且清理
// re = mysql_query(&mysql, sql);
if (re != 0)
{
cout << "mysql_real_query faied! "<< sql<<" " << mysql_error(&mysql) << endl;
}
else
{
cout << "mysql_real_query success! " << sql << endl;
}
//2 获取结果集
// mysql_use_result 不实际读取数据
//MYSQL_RES* result = mysql_use_result(&mysql);
//mysql_store_result 读取所有数据,注意缓存大小 MYSQL_OPT_MAX_ALLOWED_PACKET 默认 64M
MYSQL_RES* result = mysql_store_result(&mysql);
if (!result)
{
cout << "mysql_use_result faied! " << mysql_error(&mysql) << endl;
}
//3 遍历结果集
MYSQL_ROW row;
while (row = mysql_fetch_row(result)) //获取行
{
unsigned long * lens = mysql_fetch_lengths(result);
cout<< lens[0] << "[" << row[0] << "," << row[1] << "]" << endl;
}
//清理结果集
mysql_free_result(result);
mysql_close(&mysql);
mysql_library_end();