当前位置: 首页 > news >正文

13.使用C连接mysql

sudo useradd 用户名 - - - 创建用户
sudo passwd 用户名 - - - 创建密码

使用C连接mysql,一般在装mysql服务的时候都会自动安装好连接的包。
查看:
ls /usr/include/mysql - - - 查看头文件是否存在
ls /lib64/mysql - - - 查看动静态库是否存在
如果不存在,使用 yum install mysql-devel 安装一下

选项:-L 指定去哪里找这个库 -l 找哪个库
测试:库是否能够使用,调用成功返回库的版本。
在这里插入图片描述

在linux中如果不能直接删除,需要按住crl再进行删除

常用的库函数:
打开数据库操作模块:
MYSQL* my = mysql_init(nullptr); - - - 生成mysql库这个结构体进行操作。
关闭数据库操作模块:
mysql_close(my); - - - 每次使用musql时必须先打开,然后进行操作,最后关闭。

连接数据库:
MYSQL *mysql_real_connect(
MYSQL *mysql, // 创建的mysql结构体
const char *host, // 登陆的地点
const char *user, // 登录的用户
const char *passwd, // 登陆的密码
const char *db, // 连接哪个数据库
unsigned int port, // mysql的端口号
const char *unix_socket, // 设置为null
unsigned long clientflag // 设置为null
);
在这里插入图片描述

操作:
int mysql_query(my, sql语句) - - - 这里的sql语句为char字符串风格,不用带分号,返回0表示成功。
设置编码语言为utf8,不然利用编码插入汉字时,就会出现插入乱码
mysql_set_character_set(myfd, “utf8”);
sql语句只要写好,就可以利用该方法增删改。以下以insert为例:
在这里插入图片描述

查找:select
查找的话,单单一个语句是不能够进行查询的。因为语句只能保证操作成功,要是你想看到得把信息提取出来。
查询语句如果成功,他会将信息放到创建的my结构体中,需要利用函数将信息从my中提取出来
利用:MYSQL_RES* mysql_store_result(my); - - - 提取信息,提取出来的res 的每一行都是数据中的一行。但是这种还不好查看,因此需要再利用函数将他的每一行提取出来。
信息被提取到res后,使用完成后也需要释放res的空间:
mysql_free_result(res); - - - 释放res的空间
利用:
my_ulonglong mysql_num_rows(MYSQL_RES *res); - - - 提取行数
unsigned int mysql_num_fields(MYSQL_RES *res); - - - 提取列数
然后知道行数和列数后,利用函数将每一行整体拿出来。只需要让行数从0开始自增,他自己会拿出对应行的数据,不用你去选择拿哪一行。
MYSQL_ROW row = mysql_fetch_row(res); - - - 拿出这一行的数据
row代表这一行,然后只需要按照列将值打印就行 row[列]

拿到信息后,还想知道它对应的每一个信息的属性,包含表的属性,表的列名,表在那个库等等,所有的属性都打包成一个结构体。
利用函数获取属性结构体:
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
因为打印表的信息只关心列名和每一列的数据,因此在属性结构体中选择列名打印:
在这里插入图片描述

完整代码:

#include <iostream>
#include <string>
#include <mysql/mysql.h>
#include <unistd.h>using namespace std;
const string host = "127.0.0.1";
const string user = "ghc";
const string passwd = "123456";
const string db = "conn";
const unsigned int port = 3306;
int main()
{MYSQL* my = mysql_init(nullptr);if(my == nullptr){std::cerr << "int Mysql error" << std::endl;return 1;}if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0)==nullptr){std::cerr << "connect Mysql error" << std::endl;return 2;}mysql_set_character_set(my, "utf8");// 查询: 查询语句如果成功,他会将信息放到创建的my结构体中,需要利用函数将信息从my中提取出来string sql = "select * from user";int n = mysql_query(my, sql.c_str());cout << n << endl;MYSQL_RES* res = mysql_store_result(my); //提取信息if(res == nullptr) {cerr << "mysql_store_result 提取失败" << endl;return 4;}// 提取到数据,利用res和函数获取行和列int rows = mysql_num_rows(res); // 获取行树int fields = mysql_num_fields(res); // 获取列数cout << "行:" << rows << endl;cout << "列:" << fields << endl;// 获取属性信息,他是一个结构体包含name在内的所有属性,MYSQL_FIELD* fields_array = mysql_fetch_fields(res);for(int i=0; i<fields; i++){// filelds_array是一个表的所有属性的结构体,因此需要在结构中选择namecout << fields_array[i].name << "\t";}cout << endl;for(int i=0; i<rows; i++){// 利用函数,将每一行的数据整体拿出来放到一个空间中MYSQL_ROW row = mysql_fetch_row(res);for(int j=0; j<fields; j++){cout << row[j] << "\t";}cout << endl;}// 插入的方法,删除和修改也这样写都ok// string sql3 = "insert into user (name, age, tephone) values('武松', 20, 66666)";// int n3 = mysql_query(my, sql3.c_str());// cout << n3 << endl;// string sql1 = "insert into user (name, age, tephone) values('tom', 18, 12345)";// string sql2 = "insert into user (name, age, tephone) values('jerry', 8, 54345)";// int n1 = mysql_query(my, sql1.c_str());// int n2 = mysql_query(my, sql2.c_str());// if(n1 == 0) cout << sql1 << " success " << endl;// else cout << "sql1 filed" << endl;// if(n2 == 0) cout << sql2 << " success " << endl;// else cout << "sql2 filed" << endl;mysql_free_result(res);mysql_close(my);return 0;
}
http://www.dtcms.com/a/298649.html

相关文章:

  • ro属性和persist属性的区别
  • 什么是游戏盾(高防版)?
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-24,(知识点:二极管基础知识,单向导电性)
  • Redux 入门超详细指南
  • vue3中pinia详解
  • 关于“前导零”的问题记录,也就是(0.1)和.1这种数据处理问题
  • streamyfin(世博会)android 编译
  • 0人工沟通,它如何用AI撬动海外B端9400亿采购市场?
  • Round-Robin仲裁器
  • <HMI><威纶通><触摸屏>基于威纶通MT8106iQ触摸屏,实现自定义登录窗口(优化)
  • 内核驱动相关知识点
  • 【Agent】Common Ground 团队协作模型:Partner、Principal 与 Associate
  • 数据结构自学Day14 -- 归并排序
  • 正则表达式 \b:单词边界
  • 模拟flink处理无限数据流
  • WAIC2025预告|英码深元AI一体机将亮相华为昇腾展区,以灵活部署的能力赋能行业智能化转型
  • 学习:JS[6]环境对象+回调函数+事件流+事件委托+其他事件+元素尺寸位置
  • ReVQ (Quantize-then-Rectify,量化后修正)
  • 笛卡尔积规避:JOIN条件完整性检查要点
  • FreeRTOS—互斥信号量
  • Sweet Home 3D:一款免费的室内装修辅助设计软件
  • 【集合】JDK1.8 HashMap 底层数据结构深度解析
  • 第二章: 解密“潜在空间”:AI是如何“看见”并“记住”世界的?
  • 深入解析C语言三路快速排序算法
  • 动态规划:从入门到精通
  • 多品种小批量如何实现柔性排产?
  • 无感交互,创意飞扬:AI摄像头动捕赋能中小学AI人工智能实训室
  • Python Requests-HTML库详解:从入门到实战
  • 环境变量-进程概念(7)
  • 对自定义域和 GitHub 页面进行故障排除(Windows)