参考链接:https://www.mysqlzh.com/api/72.html
关于SQL的预处理介绍和优点不是本篇文章的重点。本篇主要介绍如何使用mysql C API提供的预处理函数。
从操作方式上来说,对数据库的操作共分为两类:
1.不带返回值的操作。如增、删、改
2.带返回值的操作。如查询,对于C API函数来说,使用上也有一点区别
事先准备:创建一张表,语句:
CREATE TABLE IF NOT EXISTS cameras(camera_id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,model INTEGER NOT NULL,width INTEGER NOT NULL,height INTEGER NOT NULL,params LONGBLOB,prior_focal_length INTEGER NOT NULL);
来看一下mysql提供的操作接口:
//插入操作,即没有返回结果集
MYSQL *conn=mysql_init(NULL);
mysql_real_connect(conn,ip,user,pass,db_name,port,NULL,0); //创建mysql连接
MYSQL_STMT* sql_stmt_add_camera_ = nullptr; //定义一个预处理对象
string sql = "INSERT INTO cameras(camera_id, model, width, height, params, "
"prior_focal_length) VALUES(?, ?, ?, ?, ?, ?);"; //定义插入表的sql语句,?为占位符,表示你要插入的值,必须这么写
sql_stmt_add_camera_ = mysql_stmt_init(conn); /* 初始化预处理句柄*/
mysql_stmt_prepare(sql_stmt_add_camera_ , sql.c_str(), sql.length());/*准备字符串操作指向的SQL语句*/
/*绑定插入的参数,即替换掉sql语句中的?*/
int val = 1;
MYSQL_BIND params[6];
memset(params, 0, sizeof(params));
params[0].buffer_type = MYSQL_TYPE_LONG;
params[0].buffer = &val;
params[0].is_null = 0;
//依次绑定6个参数
......
mysql_stmt_bind_param(sql_stmt_add_camera_, params) /* 绑定传入参数到预处理语句中*/
mysql_stmt_execute(sql_stmt_add_camera_) /* 执行与语句句柄相关的预处理操作*/
mysql_stmt_close(sql_stmt_add_camera_) /*关闭预处理句柄*/
对于查询操作,即需要返回结果集预处理操作,和上面的操作步骤基本相同,只是需要多调用一个mysql_stmt_bind_result()接口,将返回结果集与定义的MYSQL_BIND数组绑定 ,查询结果将会保存在MYSQL_BIND数组中,代码如下
//查询操作,需要返回结果集
MYSQL *conn=mysql_init(NULL);
mysql_real_connect(conn,ip,user,pass,db_name,port,NULL,0); //创建mysql连接
MYSQL_STMT* sql_stmt_query_camera_ = nullptr; //定义一个预处理对象
string sql = "select *from cameras;"; //定义插入表的sql语句,?为占位符,表示你要插入的值,必须这么写
sql_stmt_query_camera_ = mysql_stmt_init(conn); /* 初始化预处理句柄*/
mysql_stmt_prepare(sql_stmt_query_camera_ , sql.c_str(), sql.length());/*准备字符串操作指向的SQL语句*/
/*绑定查询的参数,如果查询没有条件可以不绑定*/
MYSQL_BIND param[1];
memset(param, 0, sizeof(params));
/*绑定查询的结果*/
int val;
MYSQL_BIND result[6];
memset(result, 0, sizeof(result));
result[0].buffer_type = MYSQL_TYPE_LONG;
result[0].buffer = &val;
result[0].is_null = 0;
//查询的第一个字段值将会保存在val中
//依次绑定6个参数
......
mysql_stmt_bind_result(sql_stmt_add_camera_, result) /* 绑定传入参数到预处理语句中*/
mysql_stmt_execute(sql_stmt_add_camera_) /* 执行与语句句柄相关的预处理操作*/
mysql_store_result(sql_stmt_add_camera_);
while(!mysql_stmt_fetch(stat)){ //按行返回结果,结果保存在result中
}
mysql_stmt_close(sql_stmt_add_camera_) /*关闭预处理句柄*/
关于绑定参数的类型:
类型 |
长度 |
MYSQL_TYPE_TINY |
1 |
MYSQL_TYPE_SHORT |
2 |
MYSQL_TYPE_LONG |
4 |
MYSQL_TYPE_LONGLONG |
8 |
MYSQL_TYPE_FLOAT |
4 |
MYSQL_TYPE_DOUBLE |
8 |
MYSQL_TYPE_TIME |
sizeof(MYSQL_TIME) |
MYSQL_TYPE_DATE |
sizeof(MYSQL_TIME) |
MYSQL_TYPE_DATETIME |
sizeof(MYSQL_TIME) |
MYSQL_TYPE_STRING |
data length |
MYSQL_TYPE_BLOB |
data_length |