stmt操作

stmt对于多次执行的语句比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量

stmt主要的介绍可以参考:

https://blog.csdn.net/zhouxinfeng/article/details/77891771

主要的操作是将MYSQL_BIND 与 查询的参数和查询的结果相绑定,再按行进行输出。

参见:http://blog.chinaunix.net/uid-24219701-id-1745030.html

写入:

MYSQL_STMT *stmt = mysql_stmt_init(conn); //创建MYSQL_STMT句柄char *query = "insert into stu values(?, ?);";
if(mysql_stmt_prepare(stmt, query, strlen(query)))
{fprintf(stderr, "mysql_stmt_prepare: %s\n", mysql_error(conn));return -1;
}int id; char name[20];
printf("id name: ");
scanf("%d %s", &id, name);MYSQL_BIND params[2];
memset(params, 0, sizeof(params));
params[0].buffer_type = MYSQL_TYPE_LONG;
params[0].buffer = &id;
params[1].buffer_type = MYSQL_TYPE_STRING;
params[1].buffer = name;
params[1].buffer_length = strlen(name);mysql_stmt_bind_param(stmt, params);
mysql_stmt_execute(stmt);           //执行与语句句柄相关的预处理mysql_stmt_close(stmt);
mysql_close(conn);

读出数据:

    MYSQL_STMT *stmt = mysql_stmt_init(conn); //创建MYSQL_STMT句柄char *query = "select * from stu;";if(mysql_stmt_prepare(stmt, query, strlen(query))){fprintf(stderr, "mysql_stmt_prepare: %s\n", mysql_error(conn));return -1;}int id; char name[20];//printf("id name: ");//scanf("%d %s", &id, name);MYSQL_BIND params[2];memset(params, 0, sizeof(params));params[0].buffer_type = MYSQL_TYPE_LONG;params[0].buffer = &id;params[1].buffer_type = MYSQL_TYPE_STRING;params[1].buffer = name;params[1].buffer_length = sizeof(name);//mysql_stmt_bind_param(stmt, params);mysql_stmt_bind_result(stmt, params); //用于将结果集中的列与数据缓冲和长度缓冲关联(绑定)起来mysql_stmt_execute(stmt);           //执行与语句句柄相关的预处理mysql_stmt_store_result(stmt);      //以便后续的mysql_stmt_fetch()调用能返回缓冲数据while(mysql_stmt_fetch(stmt) == 0) //返回结果集中的下一行{    printf("%d\t%s\n", id, name);}mysql_stmt_close(stmt);             mysql_close(conn);

需要注意的是:

当要绑定的是字符串MYSQL_TYPE_VAR_STRING或是不定长的blob的时候,需要将长度设为0,再使用mysql_stmt_fetch_column 获取字段的真实长度分配内存。

(见https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-fetch.html)

real_length= 0;bind[0].buffer= 0;
bind[0].buffer_length= 0;
bind[0].length= &real_length
mysql_stmt_bind_result(stmt, bind);mysql_stmt_fetch(stmt);
if (real_length > 0)
{data= malloc(real_length);bind[0].buffer= data;bind[0].buffer_length= real_length;mysql_stmt_fetch_column(stmt, bind, 0, 0);
}

本人参考各种实现,写了一个mysql的 c++封装类,源码下载: https://github.com/alongL/mysqlmgr

欢迎不吝赐教。

参考:

1.http://blog.chinaunix.net/uid-24219701-id-1745030.html

2.https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-execute.html

3.https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-fetch.html

4.https://github.com/cgy1992/mysql-cpp/

mysql 预处理stmt操作(写入数据库和从数据库中取出)相关推荐

  1. mysql timestampt 输入字符串的格式不正确._mysql中取出的时间格式不正确

    ps: 最终采用了一楼推荐的momentjs进行转换, 希望帮到后来人,此坑完结. mysql中存储的数据类型是datetime select出来都是utc时间 格式如下: 2019-07-08T03 ...

  2. MYSQL数据库命令+操作----最详细的操作教程(测试木头人)

    今天木头人在闲暇之余,整理了一些往期的笔记,欢迎大家一起学习. 这里是一些基础的命令和操作,有错误的地方欢迎大家留言指出 目录 一.mysql安装 二.基本命令 三.MySQL数据库基本操作 四.My ...

  3. MySQL期中上机操作(有答案)

    一.MySQL期中上机操作: 1. 创建数据库,名称为 MyBank 2. 创建数据表 customer (客户).deposite(存款).bank(银行),表结构如下: customer 的表结构 ...

  4. MySQL数据库在众多表中对表名的查询及预处理存储过程(变量做表名)

    以下的文章主要介绍的是MySQL数据库在众多表中进行表名与字段名的查询的实际操作步骤,以及对实现其查询所要用到的SQL 语句的介绍,还有两个实际解决方案的描述,以下就是文章的主要内容描述. 在MySQ ...

  5. mysql初级数据库_MYSQL初级数据库操作

    MYSQL是个好东西啊,只是比较会折腾人,所以我先记录一下MySQL 数据备份的基础知识,省得以后又去东找西找 Windows文件名.目录名不区分大小写,Linux区分大小写 查看MySQL中的数据库 ...

  6. qt的mysql编程_界面编程之QT的数据库操作20180801

    /*******************************************************************************************/ 一.数据库连 ...

  7. mysql数据库技巧_MySQL数据库常用操作和技巧

    MySQL数据库可以说是DBA们最常见和常用的数据库之一,MySQL的广泛应用,也使更多的人加入到学习它的行列之中.下面是老MySQL DBA总结的MySQL数据库最常见和最常使用的一些经验和技巧,分 ...

  8. MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  9. Robot Framework操作MySQL数据库和Oracle数据库

    一.Robot Framework连接MySQL数据库 1.安装databaselibrary.pymsql 通过cmd命令执行pip install robotframework-databasel ...

  10. mysql 四大基础操作_mysql数据库的基本操作

    mysql数据库的基本操作 首先我们要把mysql装好 mkdir chen/ mount.cifs //192.168.100.23/LNMP chen/ [root@localhost ~]# y ...

最新文章

  1. jQuery对象和DOM对象使用说明
  2. Google母公司5600万美元首投AI芯片初创公司,看上了SambaNova的什么?
  3. Web性能测试需监控的IIS性能指标
  4. SpringCloud Config简介
  5. 用axis开发webservice实践
  6. [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档
  7. 先来先服务算法代码_一致性哈希算法编写
  8. php ci model条件查询,php – CodeIgniter中的多条件WHERE子句
  9. 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
  10. Android:Android SDK的下载与安装
  11. android怎么操作才会出现anr_博客笔记大汇总,Android优化总结篇
  12. mysql用户管理设置权限_mysql 用户管理和权限设置
  13. 学期学会的一些代码23333原创
  14. Ubuntu调整缩放
  15. MATLAB图像处理_YUV格式详解
  16. 如何快速将多个文件合并为一个文件?
  17. netty4 io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
  18. iOS APP启动函数调用顺序~详解
  19. hive时间戳函数之unix_timestamp(),from_unixtime,to_utc_timestamp
  20. 行人重识别(1)——行人检测综述

热门文章

  1. 电信 联通双线ip接入服务配置
  2. Collecting Coins
  3. #151 – Dependency Properties Remember Non-Coerced Values(依赖属性强制转换之前的值会被记住)
  4. npm安装依赖包 版本冲突怎么办 --legacy-peer-deps的正确使用方法
  5. 三维激光雷达点云处理发展趋势
  6. 数据挖掘肿瘤预测_肿瘤分析数据挖掘及信息解读
  7. ERROR 126 HY000 Incorrect key file for table '/tmp/ sql 1
  8. pandoc如何使用自定义样式导出docx文档
  9. 微信公众号迁移公证需要哪些材料?账号迁移流程来了
  10. 揭秘 | Akuna工作体验大揭秘