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 ... 
随机推荐
- mfc CString 转 char *
			做界面时遇到需要从界面编辑框接受输入字符(用户名,密码之类),然后转为char *类型交给程序处理,记录一下找到的方法,主要参考https://blog.csdn.net/neverup_/artic ... 
- 【CSS】width和height计算
			width:calc(100% - 20px); width:-webkit-calc(100% - 20px);//chrome width:-moz-calc(100% - 20px);//fir ... 
- Android Studio 优秀插件:GsonFormat
			作为一个Android程序猿,当你看到后台给你的json数据格式时: { "id":123, "url": "http://img.donever.c ... 
- C#中winform中panel重叠无法显示问题
			C#中winform中panel重叠无法显示问题: 最近开发一个项目有个需求是需要多个模式来回切换的,本来考虑使用多个窗口来实现这个功能,但是这样做浪费资源,而且工作量大,所以想到使用panel控件来 ... 
- react 首屏性能优化
			首屏优化点:1.加载包(bundle.js)文件的大小,越小,首屏渲染速度越快 (按需加载) 2.优先渲染用户直观看到的页面部分(懒加载) 技术点:react-loadable . react-laz ... 
- linux netlink通信机制简介
			一.什么是Netlink通信机制 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口. Netlink 是一种特殊的 s ... 
- Unreal Engine 4 系列教程 Part 4:UI教程
			.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ... 
- 使用jmeter进行压力测试入门讲解
			1.下载安装jmeter 略 我这里放上5.1版本的,有需要可以下载 链接:https://pan.baidu.com/s/1xRZZmTY4do1oDU_xPit94Q&shfl=share ... 
- iOS开发请您把握现在 — 面向未来学习
			iOS开发请您把握现在 — 面向未来学习 这一篇文章,如果你是一名iOS开发正好也处于开发晋升瓶颈迷茫期,不妨停下你的脚步,花五分钟看看,兴许有你需要的!文章结尾有彩蛋 群里常见的唱哀 iOS现在到底 ... 
- opencv实践::直线检测
			问题描述 寻找英语试卷填空题的下划线,这个对后期的切图与自动 识别都比较重要. 解决思路 方法: 通过图像形态学操作来寻找直线,霍夫获取位置信息与显示. #include <opencv2/op ... 
