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的更多相关文章

  1. python学习笔记之——操作mysql数据库

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: ...

  2. openresty 学习笔记四:连接mysql和进行相关操作

    openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...

  3. 笔记-python操作mysql

    笔记-python操作mysql 1.      开始 1.1.    环境准备-mysql create database db_python; use db_python; create tabl ...

  4. Javascript学习笔记二——操作DOM

    Javascript学习笔记 DOM操作: 一.GetElementById() ID在HTML是唯一的,getElementById()可以定位唯一的一个DOM节点 二.querySelector( ...

  5. MongoDB学习笔记:Python 操作MongoDB

    MongoDB学习笔记:Python 操作MongoDB   Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...

  6. Javascript学习笔记三——操作DOM(二)

    Javascript学习笔记 在我的上一个博客讲了对于DOM的基本操作内容,这篇继续巩固一下对于DOM的更新,插入和删除的操作. 对于HTML解析的DOM树来说,我们肯定会时不时对其进行一些更改,在原 ...

  7. SQL学习笔记四之MySQL数据操作

    阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: DML =========== ...

  8. SQL学习笔记二之MySQL的数据库操作

    阅读目录 一 系统数据库 二 创建数据库 三 数据库相关操作 一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限 ...

  9. [学习笔记]Linux下mysql的基础操作

    命令 #查看版本 mysql --version   #进入mysql 命令 mysql -u root -p mysql -u root@localhost (没有密码的情况)   #创建数据库 c ...

随机推荐

  1. 20191012——POI设置单元格自动行高(思路)

    在经过Jxls或者POI导出数据至excel中后,发现有的单元格内容太多,既没有自动换行,也没有自动增大行高.那如何通过Java代码来实现呢?请看下面步骤: (一)首先,将excel设置为最合适的行高 ...

  2. UE制作PBR材质攻略Part 1 - 色彩知识

    目录 一.前言 二.色彩知识 2.1 色彩理论 2.1.1 成像原理 2.1.2 色彩模型和色彩空间 2.1.3 色彩属性 2.1.4 直方图 2.1.5 色调曲线 2.1.6 线性空间与Gamma空 ...

  3. 在Linux环境下采用压缩包方式安装JDK 13

    本文地址:https://www.cnblogs.com/oberon-zjt0806/p/11663731.html 可以,转载,出处,格式,懂?? 什么是JDK?? 好吧如果你不知道这个问题的话我 ...

  4. git一步步上传自己的项目至github,及仓库更新

    一.使用git上传项目到github 首先登陆github账号,选择新建一个库,填写项目名称,描述 创建完成之后,跳转到下面的页面,下面红框中的网址要记住,在后面上传代码的时候需要使用 接下来,我们需 ...

  5. 游戏服务器和Web服务器的区别

    用Go语言写游戏服务器也有一个多月了,也能够明显的感受到两者的区别.这篇文章就是想具体的聊聊其中的区别.当然,在了解区别之间,我们先简单的了解一下Go语言本身. 1. Go语言的特点 Go语言跟其他的 ...

  6. 【元学习】Meta Learning 介绍

    目录 元学习(Meta-learning) 元学习被用在了哪些地方? Few-Shot Learning(小样本学习) 最近的元学习方法如何工作 Model-Agnostic Meta-Learnin ...

  7. Android Studio:多包名打包

    来自:http://m.blog.csdn.net/u011315960/article/details/73251196 前言 最近有点小忙,博客都落下了,今天赶紧写点东西补上. 前几天商务找我,想 ...

  8. wampserver 运行橙色,80端口没有被占用,查看错误日志方法

    wampserver运行时橙色,经检查80端口并没有被占用,试了很多种方法都无效,去查看错误日志吧 1.以管理员身份打开CMD 注意这里必须是管理员身份的CMD ,powershell不行的 进入wa ...

  9. LeetCode 300. Longest Increasing Subsequence最长上升子序列 (C++/Java)

    题目: Given an unsorted array of integers, find the length of longest increasing subsequence. Example: ...

  10. Mybatis入门简版(补充)

    一.Mybatis 中$与#的区别 #相当于对数据 加上 双引号,$相当于直接显示数据 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#, ...