C++学习笔记13_操作MySql
1. 链接Mysql
#include <winsock.h>
#include "mysql.h"
#include <stdlib.h>
#include <string>
using std::cout;
using std::string;
- int main()
- {
- string host("localhost");
- string useName("root");
- string passWord("");
- string dbName("fmos");
- int port = ;
- //
- MYSQL *pConn;
- pConn = mysql_init(NULL);
- //第2、3、4、5参数的意思分别是:服务器地址、用户名、密码、数据库名,第6个为mysql端口号(0为默认值3306)
//或者pConn=mysql_real_connect(....)- if (mysql_real_connect(pConn, host.c_str(), useName.c_str(), passWord.c_str(), dbName.c_str(), port, NULL, ) == NULL)
- {
string error = std::string(mysql_error(pConn));//可以获取失败的原因,是char *型的。- cout<<"失败"<<endl;
- }
- else {
- cout<<"成功"<<endl;
- }
- //凡是返回指针或者引用的函数,都要特别注意,因为通常要自己销毁,所以,mysql提供了销毁的函数
- mysql_close(pConn);
- return re;
- }
2. mysql查询
- void Query(MYSQL* connect)
- {
- char * sql = "select * from fmos_project;"
- int ret=;
- ret = mysql_query(connect,sql);//只要是sql语句就可以了
- //不等于0表示失败,很奇怪
- if(ret!=)
- {
- string error = string( mysql_error(connect));
- return;
- }
- //mysql_use_result来获取记录,查询结果是暂时存在服务器的
- //mysql_store_result是一次性查到本地,其他没有区别
- MYSQL_RES* result = mysql_store_result(connect);
- if(result==NULL)
- {
- string error = string( mysql_error(connect));
- return;
- }
- MYSQL_ROW row;// MYSQL_ROW的原型是一个char**。char * a ,a能指向一堆char;而char** aa,aa能指向一堆char*。
- while( row = mysql_fetch_row(result))//一行行获取数据 , if和while都是判断()内是否非0
- {
- unsigned int columnCount = mysql_field_count(connect);//result->field_count;这个是什么?
- for (int i = ; i < columnCount; i++) {
- std::cout << row[i] << " ";//row[i]实际上是char*类型
- }
- std::cout << std::endl;
- }
- mysql_free_result(result);//不要忘记释放指针。
- }
为什么要用二级指针char**,因为返回的是一个表,实际上,应该是这样:
每一行,"id1" "a1" "b1" 。每一个属性值是char*,所以一整行是char**
3. 获取列数
- void getFiled(MYSQL* connect, MYSQL_RES* result)
- {
- unsigned int c = mysql_field_count(connect);//从句柄中获取多少列
- unsigned int cr = mysql_num_fields(result);//从查询结果中获取多少列,如果查询结果为空,就没有了
- }
4. 获取表头
- void getFiled(MYSQL_RES* result)
- {
- unsigned int num_fields=mysql_num_fields(result);
- MYSQL_FIELD *fields = mysql_fetch_fields(result); //MYSQL_FIELD 这是一个结构体,指向结构体的指针fields,也可以认为是指向结构体数组首地址的指针。
- for(unsigned int i=;i<num_fields;i++)
- {
- std::cout<<fields[i].name;
- }
- }
5. 预处理API函数
第一步: 告诉mysql服务器,有一条sql语句要执行;第二步:发送参数
好处:如果一条语句是经常使用的,如果提前将SQL写好,运行时只要发参数,能加快速度。
1. 使用msql_stmt_init();准备好环境,有点像准备好MYSQL*
2. 使用mysql_stmt_prepare()放语句
3. 使用mysql_stmt_bind_param();添加参数
3. 使用mysql_stmt_start();执行语句
- #define INSERT_SQL “INSERT INTO text_table(col1,col2,col3) VALUES(?,?,?)”
- int main()
- {
- MYSQL *mysql = mysql_init(NULL);
- char * error;
- int ret=;
- if(mysql==NULL)
- {
- error = mysql_error(mysql);
- return ;
- }
- mysql = mysql_read_connect(mysql,"localhost","root","","mydb",,NULL,);
- if(mysql==NULL)
- {
- error = mysql_error(mysql);
- return ;
- }
- //1. 初始化一个预处理环境句柄
- MYSQL_STMT *stmt=mysql_stmt_init(mysql);//MYSQL_STMT是一个结构体
- if(!stmt)//stmt首先转换为bool,不等于0为true,再!运算
- {
- return;
- }
- //2. 准备好语句。 注意这里,执行结果返回非0,就是失败;返回0才是成功。 这句只执行一次就够了。
- if(mysql_stmt_prepare(stmt,INSERT_SQL ,strlen(INSERT_SQL)))
- {
- error = msql_stmt_error(stmt);
- return;
- }
- // 准备好参数
- MYSQL_BIND bind=new MYSQL_BIND[]; //MYSQL_BIND的成员时指针类型的,因为 值要指向字符串的时候,只能指针了
- //int 的列
- int value = ;
- bind[].buffer_type=MYSQL_TYPE_LONG;
- bind[].buffer = (char*)&value;//char*转换也能代表内存首地址
- bind[].is_null = ;
- bind[].lenght = ;//不是字符串就写为0,就是空指针
- //string的列
- char *str_data = "aaaaa";
- int sting_size = ;
- bool isnull = false;
- bind[].buffer_type = MYSQL_STYPE_STRING;
- bind[].buffer =(char*)str_data;
- bind[].is_null = &isnull; //这个也是指针
- bind[].lenght = &sting_size ;//长度也是指针
- // time列
MYSQL_TIME ts;
ts.year = 1991;
ts.mouth = 12;
ts.day = 14;
ts.hour = 18;
ts.minute = 45;
ts.second = 20;
- bind[].buffer_type = MYSQL_STYPE_DATE;
- bind[].buffer =(char*)&ts;
- bind[].is_null = 0; //同理,非字符串也填0就可以了
- bind[].lenght = 0 ;//同理,非字符串也填0就可以了
- //3. 放参数
- if(mysql_stmt_bind_param(stmt,bind))
- {
- error = msql_stmt_error(stmt);
- return;
- }
- //4. 执行
- if(mysql_stmt_execute(stmt))
- {
- error = msql_stmt_error(stmt);
- return;
- }
- delete[] bind;
- //检查执行结果
- affected_rows = mysql_stmt_affected_rows(stmt);
- if(!affected_rows)
- {
- error="执行失败";
- }
- mysql_close(myql);
- }
6. mysql事务
void tran()
{
}
C++学习笔记13_操作MySql的更多相关文章
- python学习笔记之——操作mysql数据库
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: ...
- openresty 学习笔记四:连接mysql和进行相关操作
openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...
- 笔记-python操作mysql
笔记-python操作mysql 1. 开始 1.1. 环境准备-mysql create database db_python; use db_python; create tabl ...
- Javascript学习笔记二——操作DOM
Javascript学习笔记 DOM操作: 一.GetElementById() ID在HTML是唯一的,getElementById()可以定位唯一的一个DOM节点 二.querySelector( ...
- MongoDB学习笔记:Python 操作MongoDB
MongoDB学习笔记:Python 操作MongoDB Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...
- Javascript学习笔记三——操作DOM(二)
Javascript学习笔记 在我的上一个博客讲了对于DOM的基本操作内容,这篇继续巩固一下对于DOM的更新,插入和删除的操作. 对于HTML解析的DOM树来说,我们肯定会时不时对其进行一些更改,在原 ...
- SQL学习笔记四之MySQL数据操作
阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: DML =========== ...
- SQL学习笔记二之MySQL的数据库操作
阅读目录 一 系统数据库 二 创建数据库 三 数据库相关操作 一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限 ...
- [学习笔记]Linux下mysql的基础操作
命令 #查看版本 mysql --version #进入mysql 命令 mysql -u root -p mysql -u root@localhost (没有密码的情况) #创建数据库 c ...
随机推荐
- C++——多文件结构和编译预处理命令
[toc] 一.多文件结构 1.一个工程可以划分为多个源文件 类声明文件(.h文件) 类实现文件(.cpp文件) 类的使用文件(main函数所在的.cpp文件) 2.利用工程来组合各个文件 //Poi ...
- BootstrapVue 安装指南
BootstrapVue 是基于 Bootstrap v4 + Vue.js 的前端 UI 框架.BootstrapVue 作为学习 Vue.js 框架本身的入门框架,我认为是非常不错的.Bootst ...
- B/S 端构建的基于 WebGL 3D 可视化档案馆管理系统
前言 档案管理系统是通过建立统一的标准以规范整个文件管理,包括规范各业务系统的文件管理的完整的档案资源信息共享服务平台,主要实现档案流水化采集功能.为企事业单位的档案现代化管理,提供完整的解决方案,档 ...
- 针对于ECMA5Script 、ECMAScript6、TypeScript的认识
什么是ECMAScript.什么又是ECMA? Ecma国际(Ecma International)是一家国际性会员制度的信息和电信标准组织.1994年之前,名为欧洲计算机制造商协会(European ...
- 【Java】web实现图片在线预览
一.场景还原 用户上传了一张图片,已有服务器保存路径,现由于系统配置无法直接通过图片URL打开预览图片,需实现点击预览将图片显示在浏览器上. 二.实现方法 html: <a href=" ...
- redis相关缓存知识
Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...
- Redis单线程架构以及工作方式
一.单线程模型 Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程.其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的每一条到达服务端的命令都不会 ...
- Spring Boot 2.2 正式发布,大幅性能提升 + Java 13 支持
之前 Spring Boot 2.2没能按时发布,是由于 Spring Framework 5.2 的发布受阻而推迟.这次随着 Spring Framework 5.2.0 成功发布之后,Spring ...
- Celery的使用完成异步任务与定时任务
0917自我总结 Celery的使用 一.官方文档 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryp ...
- 小白学 Python(4):变量基础操作
人生苦短,我选Python 引言 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 前面的文章中,我们介绍了 ...