mysql 预处理stmt操作(写入数据库和从数据库中取出)
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操作(写入数据库和从数据库中取出)相关推荐
- mysql timestampt 输入字符串的格式不正确._mysql中取出的时间格式不正确
ps: 最终采用了一楼推荐的momentjs进行转换, 希望帮到后来人,此坑完结. mysql中存储的数据类型是datetime select出来都是utc时间 格式如下: 2019-07-08T03 ...
- MYSQL数据库命令+操作----最详细的操作教程(测试木头人)
今天木头人在闲暇之余,整理了一些往期的笔记,欢迎大家一起学习. 这里是一些基础的命令和操作,有错误的地方欢迎大家留言指出 目录 一.mysql安装 二.基本命令 三.MySQL数据库基本操作 四.My ...
- MySQL期中上机操作(有答案)
一.MySQL期中上机操作: 1. 创建数据库,名称为 MyBank 2. 创建数据表 customer (客户).deposite(存款).bank(银行),表结构如下: customer 的表结构 ...
- MySQL数据库在众多表中对表名的查询及预处理存储过程(变量做表名)
以下的文章主要介绍的是MySQL数据库在众多表中进行表名与字段名的查询的实际操作步骤,以及对实现其查询所要用到的SQL 语句的介绍,还有两个实际解决方案的描述,以下就是文章的主要内容描述. 在MySQ ...
- mysql初级数据库_MYSQL初级数据库操作
MYSQL是个好东西啊,只是比较会折腾人,所以我先记录一下MySQL 数据备份的基础知识,省得以后又去东找西找 Windows文件名.目录名不区分大小写,Linux区分大小写 查看MySQL中的数据库 ...
- qt的mysql编程_界面编程之QT的数据库操作20180801
/*******************************************************************************************/ 一.数据库连 ...
- mysql数据库技巧_MySQL数据库常用操作和技巧
MySQL数据库可以说是DBA们最常见和常用的数据库之一,MySQL的广泛应用,也使更多的人加入到学习它的行列之中.下面是老MySQL DBA总结的MySQL数据库最常见和最常使用的一些经验和技巧,分 ...
- MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】
MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...
- Robot Framework操作MySQL数据库和Oracle数据库
一.Robot Framework连接MySQL数据库 1.安装databaselibrary.pymsql 通过cmd命令执行pip install robotframework-databasel ...
- mysql 四大基础操作_mysql数据库的基本操作
mysql数据库的基本操作 首先我们要把mysql装好 mkdir chen/ mount.cifs //192.168.100.23/LNMP chen/ [root@localhost ~]# y ...
最新文章
- jQuery对象和DOM对象使用说明
- Google母公司5600万美元首投AI芯片初创公司,看上了SambaNova的什么?
- Web性能测试需监控的IIS性能指标
- SpringCloud Config简介
- 用axis开发webservice实践
- [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档
- 先来先服务算法代码_一致性哈希算法编写
- php ci model条件查询,php – CodeIgniter中的多条件WHERE子句
- 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
- Android:Android SDK的下载与安装
- android怎么操作才会出现anr_博客笔记大汇总,Android优化总结篇
- mysql用户管理设置权限_mysql 用户管理和权限设置
- 学期学会的一些代码23333原创
- Ubuntu调整缩放
- MATLAB图像处理_YUV格式详解
- 如何快速将多个文件合并为一个文件?
- netty4 io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
- iOS APP启动函数调用顺序~详解
- hive时间戳函数之unix_timestamp(),from_unixtime,to_utc_timestamp
- 行人重识别(1)——行人检测综述
热门文章
- 电信 联通双线ip接入服务配置
- Collecting Coins
- #151 – Dependency Properties Remember Non-Coerced Values(依赖属性强制转换之前的值会被记住)
- npm安装依赖包 版本冲突怎么办 --legacy-peer-deps的正确使用方法
- 三维激光雷达点云处理发展趋势
- 数据挖掘肿瘤预测_肿瘤分析数据挖掘及信息解读
- ERROR 126 HY000 Incorrect key file for table '/tmp/ sql 1
- pandoc如何使用自定义样式导出docx文档
- 微信公众号迁移公证需要哪些材料?账号迁移流程来了
- 揭秘 | Akuna工作体验大揭秘