mysql C API 预处理接口

参考链接: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

你可能感兴趣的:(mysql,mysql,数据库)