数据库—mysql、数据库编程(API)

article/2025/9/20 13:58:25

1. Linux平台准备

        (1)安装SDK开发包的命令

sudo apt-get install libmysqlclient-dev

        (2)编译时需要链接的库:-lmysqlclient

2. mysql 的初始化和清理

#include <mysql/mysql.h>
MYSQL mysql1;  //创建句柄
mysql_init(&mysql1);  //初始化句柄
mysql_close(&mysql);  //关闭句柄

3. mysql 的连接登录

        (1)连接登录 mysql_real_connect

const char *p = "192.168.126.215";  //配置ip
const char *user = "root";  //配置用户名
const char *password" = "123456";  //配置密码
const char *db = "test";  //配置要打开的数据库if ( mysql_real_connect(&mysql1, ip, user, password, db, 13306, nullptr, 0) == 0)  //等于0则打开失败
{cout<<"connect error"<<endl;
}
else
{cout<<"connect ok"<<endl;
}

        (2)设置断开自动重连 

//设置断开重连的功能
int ret = 1;
mysql_options(&mysql1, MYSQL_OPT_RECONNECT, &ret);
//中间的宏表示如果发现连接丢失,则启动与服务器的自动再连接;//设置自动检测的超时时间
int timeout = 3;
mysql_options(&mysql1, MYSQL_OPT_CONNECT_TIMEOUT, &timeout);
//中间的宏表示以秒为单位的连接超时,即超过3秒就启动重新连接//设置是否连接的检测
if( mysql_ping(&mysql1) != 0 )
{cout<<"connect failed"<<endl;
}
else
{cout<<"connect success"<<endl;
}

4. mysql 的数据查询

        (1)执行sql语句,注意:执行sql语句后,必须获取结果集并且清理;

//创建表
string sql = "create table person(id int, name varchar(20), age int";
mysql_real_query(&mysql, sql.c_str(), sql.size());
//mysql_query(&mysql, sql.c_str());  和上面不同的是,这里并没有指定长度,执行效率没有上面的快
//对于包含二进制数据的查询,必须使用mysql_real_query(),因为二进制代码数据可能包含‘\0’字符;//插入数据
string sql2 = "insert into person(id, name, age)values(1, 'zhangsan', 14);
mysql_real_query(&mysql, sql2.c_str(), sql2.size());//查询数据
string sql3 = "select * from person";
mysql_real_query(&mysql, sql3.c_str(), sql3.size());

        (2)获取结果集

//获取结果集
MYSQL_RES *result;  //定义一个MYSQL_RES结构;
result = mysql_use_result(&mysql1);  //将查询结构保存在result中;
if(result == nullptr)
{cout<<"select error"<<endl;
}//获取字段个数,即查询获得的结果里有几列数据
int nums = 0;  
nums = mysql_num_fields(result);  //属于表结构的获取//获取字段名,即列的名称
MYSQL_FIELD * fields;  //字段名的数据类型的变量
fields = mysql_fetch_fields(result);  //属于表结构的获取
for(int i = 0; i < num; i++)
{cout<<fields[i].name<<"|";
}
cout<<endl;//遍历显示结果
MYSQL_ROW row;  //存储每一行数据的数据类型的变量
while( (row = mysql_fetch_row(result)) != nullptr)  //mysql_fetch_row()函数从指定的结果集中获取一行数据返回给row,是数组的形式,即row内部是字符串数组指针(二级指针)
{for(i = 0; i < nums; i++){cout<<row[i]<<"|";}cout<<endl;
}

        (3)清理结果集

//释放结果集的指针空间
mysql_free_result(result);

整体示例如下:

#include <iostream>
#include <mysql/mysql.h>
#include <unistd.h>using namespace std;int main(int argc, char **argv)
{MYSQL mysql1;mysql_init(&mysql1);const char *ip = "192.168.226.128";const char *user = "root";const char *password = "123456";const char *db = "test";if(mysql_real_connect(&mysql1, ip, user, password, db, 13306, nullptr,0) == 0){cout<<"connect error"<<endl;}else{cout<<"connect ok"<<endl;}string sql = "create table person(id int, name varchar(20), age int)";mysql_real_query(&mysql1, sql.c_str(), sql.size());// string sql1 = "select"int ret = 1;mysql_options(&mysql1, MYSQL_OPT_RECONNECT, &ret);int timeout = 3;mysql_options(&mysql1, MYSQL_OPT_CONNECT_TIMEOUT, &timeout);// while(1)  //测试断开重连功能// {//     if(mysql_ping(&mysql1) != 0)//     {//         cout<<"connect failed"<<endl;//     }//     else//     {//         // cout<<"connnect ok"<<endl;//     }//     sleep(1);// }string sql2 = "insert into person(id, name, age)values(1,'zhangsan',12)";mysql_real_query(&mysql1, sql2.c_str(), sql2.size());string sql22 = "insert into person(id, name, age)values(2,'lisi',16)";mysql_real_query(&mysql1, sql22.c_str(), sql22.size());string sql3 = "select * from person";mysql_real_query(&mysql1, sql3.c_str(), sql3.size());MYSQL_RES * result = mysql_use_result(&mysql1);if(result == nullptr){cout<<"select error"<<endl;}int nums = 0;nums = mysql_num_fields(result);cout<<"nums = "<<nums<<endl;MYSQL_FIELD * fields = mysql_fetch_fields(result);for(int i = 0; i < nums; i++){cout<<fields[i].name<<"|";}cout<<endl;MYSQL_ROW row;while((row = mysql_fetch_row(result)) != nullptr){for(int i =0; i < nums; i++){cout<<row[i]<<"|";}cout<<endl;}mysql_free_result(result);mysql_close(&mysql1);return 0;
}

运行结果如下:

5. mysql 显示中文

//设置中文的思路是统一设置字符集为utf8;
const char * csname = "utf8";
mysql_set_character_set(&mysql, csname);

6. 图片存储与读取保存的例子

#include <iostream>
#include <mysql/mysql.h>
#include <thread>
#include <string>
#include <sstream>
#include <map>
#include <chrono>
#include <fstream>
using namespace std;
using namespace chrono;int main()
{//初始化mysql上下文MYSQL mysql;//单线程模式 mysql_init自动调用 mysql_library_init 线程不安全mysql_init(&mysql);const char* host = "192.168.226.128";//const char *host = "192.168.0.203";const char* user = "root";const char* pass = "123456";const char* db = "test";		//数据库名称//CLIENT_MULTI_STATEMENTS 支持多条sql语句if (!mysql_real_connect(&mysql, host, user, pass, db, 13306, 0, CLIENT_MULTI_STATEMENTS))//if (!mysql_real_connect(&mysql, host, user, pass, db, 3306, 0, 0)){cout << "mysql connect failed!" << mysql_error(&mysql) << endl;}else{cout << "mysql connect success!" << endl;}string sql = "";//1 创建好存放二进制数据的表 t_datasql = "CREATE TABLE IF NOT EXISTS `t_data` (\`id` int AUTO_INCREMENT,\`name` varchar(1024),\`data` blob,\`size` int,\PRIMARY KEY(`id`))";int re = mysql_query(&mysql, sql.c_str());if (re != 0){cout << mysql_error(&mysql) << endl;}//2 清空表 truncate t_datasql = "truncate t_data";re = mysql_query(&mysql, sql.c_str());if (re != 0){cerr << mysql_error(&mysql) << endl;}//3 初始化stmt mysql_stmt_initMYSQL_STMT* stmt = mysql_stmt_init(&mysql);if (!stmt){cerr << "mysql_stmt_init failed!" << mysql_error(&mysql) << endl;}//4 预处理sql语句sql = "INSERT INTO `t_data` (name,data,size) VALUES(?,?,?)";if (mysql_stmt_prepare(stmt, sql.c_str(), sql.size())){cerr << "mysql_stmt_prepare failed!" << mysql_stmt_error(stmt) << endl;}//5 打开并读取文件string path = ".//";string filename = "mysql.jpg";cout << path + filename << endl;//读取二进制fstream in(path + filename, ios::in | ios::binary);if (!in.is_open()){cerr << "file " << filename << " open failed!" << endl;}//文件指针移动到结尾处in.seekg(0, ios::end);//文件大小和文件二进制地址int filesize = in.tellg();//回到开头in.seekg(0, ios::beg);char* data = new char[filesize];int readed = 0; //已经读了多少while (!in.eof()){in.read(data + readed, filesize - readed);//读取了多少字节if (in.gcount() <= 0)break;readed += in.gcount();}in.close();//6 绑定字段MYSQL_BIND bind[3] = { 0 };bind[0].buffer_type = MYSQL_TYPE_STRING;  //name 文件名bind[0].buffer = (char*)filename.c_str();bind[0].buffer_length = filename.size();bind[1].buffer_type = MYSQL_TYPE_BLOB;   //data 文件二进制内容bind[1].buffer = data; //二进制文件bind[1].buffer_length = filesize;//文件大小bind[2].buffer_type = MYSQL_TYPE_LONG;bind[2].buffer = &filesize;if (mysql_stmt_bind_param(stmt, bind) != 0){cerr << "mysql_stmt_bind_param failed! " << mysql_stmt_error(stmt) << endl;}//7 执行stmt sqlif (mysql_stmt_execute(stmt) != 0){cerr << "mysql_stmt_execute failed! " << mysql_stmt_error(stmt) << endl;}delete data;mysql_stmt_close(stmt);sql = "select * from t_data";re = mysql_query(&mysql, sql.c_str());if (re != 0){cerr << "mysql query failed!" << mysql_error(&mysql) << endl;}//获取结果集MYSQL_RES* res = mysql_store_result(&mysql);if (!res){cerr << "mysql_store_result failed!" << mysql_error(&mysql) << endl;}//取一行数据MYSQL_ROW row = mysql_fetch_row(res);if (!row){cerr << "mysql_fetch_row failed!" << mysql_error(&mysql) << endl;}cout << row[0] << " " << row[1] << " " << row[3] << endl;//获取每列数据的大小unsigned long* lens = mysql_fetch_lengths(res);int fnum = mysql_num_fields(res);for (int i = 0; i < fnum; i++){cout << "[" << lens[i] << "]";}filename = "out_";filename += row[1];fstream out(filename, ios::out | ios::binary);if (!out.is_open()){cerr << "open file  " << filename << " failed!" << endl;}out.write(row[2], lens[2]);out.close();mysql_close(&mysql);mysql_library_end();std::cout << "Mysql 8.0 API!\n";mysql_close(&mysql);mysql_library_end();std::cout << "Mysql 8.0 API!\n";getchar();
}


http://chatgpt.dhexx.cn/article/Iivv9nBY.shtml

相关文章

8.数据库编程

一、思维导图 二、基础梳理 1.游标的使用步骤 ① 声明游标。 用DECLARE语句为一条SELECT语句定义游标 EXEC SQL DECLARE<游标名> CURSOR FOR <SELECT语句>;使用T-SQL语句生成一个结果集&#xff0c;并且定义游标的特征&#xff0c;如游标中的记录是否可以修改。…

数据库编程----Mysql简介

数据库编程----Mysql简介 文章目录 一、什么是Mysql二、Mysq的l特点三、总结 一、什么是Mysql Mysql是一个关系型数据库管理系统二、Mysq的l特点 三、总结 Mysql是一个关系型的数据管理系统

6.数据库编程

PL-SQL编程 1.PL/SQL的特点 PL(Procedure Language)/SQL&#xff09;是Oracle在数据库中引入的一种过程化的编程语言。 PL/SQL是对SQL的扩充&#xff1a;具有为程序开发而设计的特性&#xff1b; 在PL/SQL 中可以使用变量&#xff0c;进行流程控制&#xff0c;来实现比较复杂…

编程语言与数据库

从新近的TIOBE编程语言排名可看到&#xff0c;Java、C依然稳定地在最受欢迎前列。 因具备图灵完备性&#xff0c;2018年才重新被纳入清单的SQL语言已快速出现在第9位置&#xff08;7月&#xff09;——这似乎意味着&#xff0c;传统的RDBMS(关系数据库系统)仍然是应用的主流&am…

java数据库编程入门

一、JDBC概述 1、JDBC是Java数据库连接技术的简称&#xff0c;提供连接各种常用数据库的能力。 2、JDBC模型 JAVA程序一般通过调用JDBC所定义的类和接口来处理数据库中的数据&#xff0c;也就是通过调用JDBC的驱动程序实现对数据库的操作。 3、JDBC操作数据库过程 基于JDBC…

Python之数据库编程

目录 一、MySQL数据库的使用 数据库相关操作 二、数据库增删改查 增加 修改 删除 三、数据库标准写法 一、MySQL数据库的使用 建表 CREATE TABLE py_student( id INTEGER primary key auto_increment, name INTEGER not null, gender varchar(11) default 男 , birthday d…

Java-数据库编程技术(MySQL)

初识MySQL 数据库简介 什么是数据库 数据库&#xff08;Database&#xff0c;DB&#xff09;就是存放数据的仓库&#xff0c;为了实现一定目的&#xff0c;按照某种规则组织起来的数据的集合。当然数据有多种形式&#xff0c;如文字、数码、符号、图形、声音等。从广义的角度…

【数据库系统】数据库编程

嵌入式SQL的处理过程&#xff1a; 嵌入式SQL是将SQL语句嵌入程序设计语言中&#xff0c;被嵌入的设计语言为主语言。 当主语言为C语言时&#xff0c;语法格式为&#xff1a; EXEC SQL <SQL语句> 嵌入式SQL语句与主语言之间的通信&#xff1a; 将SQL嵌入到高级语言中混…

数据库应用(mysql)数据库编程

第1关&#xff1a;创建存储过程1 任务描述 本关任务&#xff1a; 1.新建一个没有参数的存储过程p1&#xff0c;显示product表中所有数据。 2.调用p1。 USE petstore; create procedure p1() #新建一个没有参数的存储过程 select * from product; call p1(); …

java数据库编程

java数据库编程 刚入门学习java数据库的编程&#xff0c;看了一部分的java核心技术卷2的内容&#xff0c;结合在blibli上看了javaweb的视频&#xff0c;先写一个入门级的数据库文章。 jdbc是由java定制的一套操作数据库的API&#xff08;应用程序编程接口&#xff09;。通过…

MySQL数据库编程(C++)介绍

本文主要介绍基于 C 编程语言&#xff0c;实现 MySQL 数据库编程的相关知识。 1 概述 本文利用 MySQL 接口实现基于 C 编程语言的 MySQL 数据库编程。 官网中对于 MySQL 的介绍如下&#xff1a; MySQL is a C wrapper for MySQL’s C API. It is built around the same prin…

数据库编程——简单教程

一、实验目的 1、掌握存储过程的概念、优点、特点及用途&#xff1b; 2、掌握创建、执行、修改和删除存储过程的方法。 二、实验内容 &#xff08;一&#xff09;附加上次实验所创建的数据库“db_Library”&#xff0c;并回顾该库的数据表信息。 &#xff08;二&#xff09;练习…

数据库基础编程

连接mysql在黑窗口 mysql -u root -p #登录MySQL SQL语句分类 数据库操作 创建数据库 create database [if not exists] db_name; 1.character set :指定数据库采用的字符集&#xff0c;如果不指定字符集&#xff0c;默认utf8 2&#xff0c;collate&#xff1a;指定数据库…

数据库编程

数据库编程 T-SQL编程基础知识 标识符 标识符分类 常规标识符&#xff08;严格遵守标识符格式规则&#xff09; 界定标识符&#xff08;引号”或方括号[]&#xff09;标识符格式规则 字母或_、、&#xff03;开头的字母数字或_、、$序列 不与保留字相同 长度小于128 不符合规…

数据库编程之ODBC编程

ODBC优点 移植性好 能同时访问不同的数据库 共享多个数据资源 ODBC概述 ODBC产生的原因 由于不同的数据库管理系统的存在&#xff0c;在某个关系数据库管理系统下编写的应用程序就不能在另一个关系数据库管理系统下运行 许多应用程序需要共享多个部门的数据资源&#xff0c…

第8章 数据库编程

文章目录 ❖第一节 T-SQL编程基础标识符注释语句表达式SET、SELECT区别 流程控制语句选择结构❖IF ELSECASE语句搜索式CASE语句 循环结构等待语句返回语句 系统函数标量函数日期和时间函数字符串函数 数据类型转换函数 ❖第二节 游标&#xff08;重点&#xff09;1. 声明游标2.…

teredo实现ipv4公网环境下接入ipv6

teredo实现ipv4公网环境下接入ipv6 系统&#xff1a;macOS High Sierra 10.13.3 测试成功 软件下载 下载安装Miredo http://www.deepdarc.com/miredo-osx-prerelease2.pkg.zip 项目github地址&#xff1a;https://github.com/darconeous/miredo-osx下载安装tuntaposx http…

Tornado简介

Tornado龙卷风是一个开源的网络服务器框架&#xff0c;它是基于社交聚合网站FriendFeed的实时信息服务开发而来的 Tornado是使用Python编写的Web服务器兼Web应用框架与主流Web服务器框架不同的是&#xff0c;Tornado是异步非阻塞式服务器&#xff0c;得益于非阻塞式和对epoll模…

【小白教程】win10系统如何开启ipv6

Teredo 是一种网络协议&#xff0c;用于在客户端和服务器之间建立安全通信&#xff0c;并且在使用网络地址转换 (NAT) 的路由器后增强设备之间的连接。 #####以下代码均在cmd窗口运行###### 一、设置Teredo 服务器 1、设置Teredo 服务器 netsh interface teredo set state …

Teredo Tunnel Adapter: Error Code 10

Teredo Tunneling 该设备无法启动 错误代码 ErrCode:10 解决方法 前文&#xff1a; Win7 系统&#xff0c;打算开启IPV6&#xff0c;本地连接的网络 ip6 驱动是异常的&#xff0c;先重新安装了网卡驱动。 过程&#xff1a; 几次尝试之后&#xff0c;还是无法启动&#xff0c;…