C/C++连接数据库,包含完整代码。

news2024/11/17 16:17:46

C/C++连接数据库

本篇文章意在简洁明了的在linux环境下使用C/C++连接远程数据库,并对数据库进行增删查改等操作。我所使用的环境是centos7,不要环境除环境配置外,代码是大同小异的。完整代码在最底部!!!

1.前提准备

在讲解如何使用代码连接数据库前,我们先来了解一下相关环境的问题。有些同学在写完代码后,会发现编译报如下错误。
在这里插入图片描述
我相信大家已经能看出问题所在了,那就是相关的lib库和include头文件在编译的时候链接不到。所以大家一定先配置好该链接属性后在进行代码的编译运行!!!

可通过mysql_get_client_info()方法验证lib和include引入是否成功,如下代码所示。

#include <stdio.h>
#include <mysql.h>
int main()
{
	printf("mysql client Version: %s\n", mysql_get_client_info());
	return 0;
}

2.必须先对数据库初始化!

//创建数据句柄。
MYSQL *my = mysql_init(nullptr);

3.链接数据库

const std::string host="127.0.0.1";
const std::string user="sja";
const std::string password = "*****";
const std::string db = "books";
const unsigned int port = 8888;
mysql_real_connect(my,//上面创建的数据库句柄MYSQL指针
host.c_str(),//目标数据库主机
user.c_str(),//目标数据库用户名
password.c_str(),//目标数据库用户密码
db.c_str(),//指定连接哪一个库
port, //目标数据库的端口号
//下面两个参数默认如下即可!
nullptr, 
0);

4.设置编码格式

连接的数据库默认是阿拉伯语,会有编码混乱问题,为了统一字符的编码我们要自行设置数据库的编码格式。

 mysql_set_character_set(my, "utf8");

5.访问数据库

5.1 对数据库增删改的访问

这一部分对数据库的访问相比查询来说不涉及数据的返回问题,所以这部分的操作也是最为简单容易的。话不多说直接上代码。

//这个三个是最简单的,只要sql执行完毕,就完了!
    std::string sql1 = "insert into test values (4, \'黎明\')";
    std::string sql2 = "delete from test where id=3";
    std::string sql3 = "update test set name=\'彬彬\' where id=2";
    int code =0;
    mysql_query(my, sql1.c_str());
    mysql_query(my, sql2.c_str());
    mysql_query(my, sql3.c_str());
    //对于返回值code,成功为0。

5.2 对数据库查找的访问

select 其实是最不好处理的!!select sql执行完,只是第一步,还需要对数据进一步解析!解析的过程是需要进行处理的,直接上代码。

//	1.解析数据 -- 获取行号和列号
    MYSQL_RES *result = mysql_store_result(my);
    int rows = mysql_num_rows(result);
    int cols = mysql_num_fields(result);
    std::cout << "行数: " << rows << ", 列数: " << cols << std::endl;

    //2.解析数据 -- 获取表中列名 -- 实际开发一般不用,仅仅是为了测试代码的完整性
    MYSQL_FIELD *fields = mysql_fetch_fields(result);
    for(int i = 0; i < cols; i++)
    {
        std::cout << fields[i].name << "\t";
    }
    std::cout << std::endl;

    //3. 解析数据 -- 获取表中的数据 -- 重要
    for(int i = 0; i < rows; i++)
    {
        MYSQL_ROW line = mysql_fetch_row(result); //获取完整的一行记录[可能包含了多列]
        for(int j = 0; j < cols; j++)
        {
            std::cout << line[j] << "\t"; //将记录内部的多列字符串依次打印!
        }
        std::cout << std::endl;
    }

6.关闭数据库

其中上面的mysql_store_result函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 一定注意这里的内存泄露问题,在关闭数据库前释放result!!!

//	关闭数据库
    free(result);
    mysql_close(my);

7.完整代码

#include <iostream>
#include <string>
#include <cstdio>
#include <mysql/mysql.h>

const std::string host="127.0.0.1";
const std::string user="username";
const std::string password = "888888888";
const std::string db = "user_databases";
const unsigned int port = 8888;

int main()
{
    //0. 创建mysql句柄
    MYSQL *my = mysql_init(nullptr);

    //1. 链接数据库
    if(mysql_real_connect(my,host.c_str(),user.c_str(), password.c_str(),db.c_str(),port, nullptr, 0) == nullptr)
    {
        std::cout << "connect failed" << std::endl;
        return 1;
    }
    //1.1: 需要设置链接的编码格式
    mysql_set_character_set(my, "utf8");
    std::cout << "connect success" << std::endl;
    //2. 访问 数据库.test id, name
    //这个三个是最简单的,只要sql执行完毕,就完了!
    // std::string sql = "insert into test values (4, \'黎明\')";
    // std::string sql = "delete from test where id=3";
    // std::string sql = "update test set name=\'彬彬\' where id=2";

    //2.1 select 其实是最不好处理的!!select sql执行完,只是第一步,还需要对数据进一步解析!
    std::string sql = "select name from test where id = 4";
    int code = mysql_query(my, sql.c_str());
    if(code != 0)
    {
        std::cout << "execute: " << sql << " failed" << std::endl;
        return 2;
    }
    std::cout << "execute: " << sql << " success" << std::endl;
    //2.2 解析数据 -- 获取行号和列号
    MYSQL_RES *result = mysql_store_result(my);
    int rows = mysql_num_rows(result);
    int cols = mysql_num_fields(result);
    std::cout << "行数: " << rows << ", 列数: " << cols << std::endl;

    //2.3 解析数据 -- 获取表中列名 -- 一般不用,仅仅是为了测试代码的完整性
    MYSQL_FIELD *fields = mysql_fetch_fields(result);
    for(int i = 0; i < cols; i++)
    {
        std::cout << fields[i].name << "\t";
    }
    std::cout << std::endl;

    //2.4 解析数据 -- 获取表中的数据 -- 重要
    for(int i = 0; i < rows; i++)
    {
        MYSQL_ROW line = mysql_fetch_row(result); //获取完整的一行记录[可能包含了多列]
        for(int j = 0; j < cols; j++)
        {
            std::cout << line[j] << "\t"; //将记录内部的多列字符串依次打印!
        }
        std::cout << std::endl;
    }

    //3. 关闭数据库
    free(result);
    mysql_close(my);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1032822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[极客大挑战 2019]RCE ME 取反绕过正则匹配 绕过disable_function设置

目录 取反 1.蚁剑插件绕过 2.baypass disable_function open_dir/disable_function putenv()/LD_PRELOAD 来绕过限制 利用条件 利用思路 有意思。。。。 <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("Th…

redis的安装、基础命令及常用数据结构

文章目录 前言一、Redis安装1.Ubuntu下安装&#xff08;1&#xff09;切换到root用户下&#xff08;2&#xff09;使用apt安装redis5&#xff08;3&#xff09;为了使redis支持远程连接&#xff0c;修改以下地方&#xff08;4&#xff09;验证安装是否成功 2.Centos7下安装&…

【C++】STL简介 | string类的常用接口

目录 STL简介 学string类前的铺垫 概念 为什么要学string类 string类的底层&#xff08;了解&#xff09; 编码表的故事 string类的常用接口与应用 3个必掌握的构造 赋值 访问字符operator[] 初识迭代器&#xff08;iterator&#xff09; 反向迭代器 用范围for遍历…

uniapp获取一周日期和星期

UniApp可以使用JavaScript中的Date对象来获取当前日期和星期几。以下是一个示例代码&#xff0c;可以获取当前日期和星期几&#xff0c;并输出在一周内的每天早上和晚上&#xff1a; // 获取当前日期和星期 let date new Date(); let weekdays ["Sunday", "M…

剔除数据中的异常值(python实现)

目录 一、3σ原则 二、箱线图发现异常值 三、boxcox数据变换 一、3σ原则 该准则仅局限于对正态或近似正态分布的样本数据处理,此外,当测量次数少的情形用准则剔除粗大误差是不够可靠的。 异常值是指样本中的个别值,其数值明显偏离其余的观测值。异常值也称离群点,异常…

xpath定位不包含某种属性的元素

今天定位一个页面中的input文本框&#xff0c;发现竟然有两个几乎一模一样的html代码的input文本框。 唯一不同的是&#xff0c;一图中的input有一个comps"[object Object],[object Object]"的属性和属性值&#xff0c;二图则没有。我要定位的是二图中的input&#x…

AUTOSAR实战篇:手把手带你搞定Watchdog协议栈

AUTOSAR实战篇:手把手带你搞定Watchdog协议栈 前言 小T出品,必是精品! 手把手搞定Watchdog协议栈,你值得拥有! 正文 在进行Watchdog协议栈实战之前,建议先阅读小T之前有关Watchdog协议栈的两篇文章《Watchdog协议栈上》与《Watchdog协议栈下》先了解下在AUTOSAR框架下的W…

【Redis】第7讲 常用的操作命令

连接redis并测试 redis-cliping 设置并获取数据 set k1 chinaget k1 测试性能 rootsue-virtual-machine:~# redis-benchmark ctrlc 退出redis,执行命令5秒就ctrlc关闭&#xff0c;性能要看电脑的配置高低 默认16个数据库 vim /opt/redis-5.0.4/redis.conf 数据库键的数量 …

深入理解web安全攻防策略,看完这一篇就够了

前言 互联网时代&#xff0c;数据安全与个人隐私信息等受到极大的威胁和挑战&#xff0c;本文将以几种常见的攻击以及防御方法展开分析。 1. XSS (跨站脚本攻击) 定义&#xff1a;通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击…

王道考研数据结构代码总结(第八章)

目录 排序插入排序直接插入排序折半插入希尔排序链表的插入排序插入类排序总结 交换排序冒泡排序快速排序 选择排序简单选择排序堆排序堆的插入堆的删除 归并排序基数排序 本文包含王道考研讲课中所涉及的数据结构中的所有代码&#xff0c;当PPT代码和书上代码有所区别时以咸鱼…

“智慧”北京,人工智能引领“新风尚”

原创 | 文 BFT机器人 北京时间&#xff0c;9月15日&#xff0c;北京人工智能产业峰会暨中关村科学城科创大赛颁奖典礼在北京中关村举行&#xff0c;同时惠阳还举行了“中关村人工智能大模型产业集聚区”启动建设的揭牌仪式。 此次大会围绕北京AI产业的建设与发展&#xff0c;各…

一篇文章彻底弄懂单调栈!!!

前言 最近梳理完中间件后荔枝一边学项目一边刷算法&#xff0c;一刷了代码随想录中的字符串、双指针、栈和队列以及单调栈。其中感觉比较有难度的还是单调栈嘿&#xff0c;因此有必要(水)梳理一篇文章来复盘一下单调栈的相关知识~ 希望复盘完后可以有所收获&#xff01; 文章目…

某音网页端 X-Bogus 参数

逆向目标 目标&#xff1a;某音网页端用户信息接口 X-Bogus 参数 接口&#xff1a;aHR0cHM6Ly93d3cuZG91eWluLmNvbS9hd2VtZS92MS93ZWIvdXNlci9wcm9maWxlL290aGVyLw 什么是 JSVMP&#xff1f; JSVMP 全称 Virtual Machine based code Protection for JavaScript&#xff0c;即 …

根据条件关闭软件

使用下载工具时&#xff0c;经常出现磁盘空间已满&#xff0c;无法下载的情况。 使用shell写一个监控&#xff0c;每2分钟执行一次。判断当前磁盘的空间&#xff0c;低于2G时&#xff0c;关闭下载软件。 获取空间大小 ➜ ~ df -h …

如何运用API接口获取淘宝1688京东商品数据:从入门到实践

一、引言 随着电子商务的飞速发展&#xff0c;许多电商平台提供了API接口&#xff0c;允许开发者获取商品数据&#xff0c;以创建各种创新的应用。本文将详细介绍如何使用API接口获取商品数据&#xff0c;并通过代码示例进行演示。 二、API接口概述 1.API接口定义 API&…

【校招VIP】数据库理论之数据库范式

考点介绍&#xff1a; 范式是指关系数据库中的一种数据结构设计规范&#xff0c;用于规范关系型数据库中数据的存储方式&#xff0c;目的是为了消除冗余数据&#xff0c;减少数据的重复性&#xff0c;提高数据的一致性、完整性和正确性&#xff0c;避免数据的不一致性和冲突 …

三相组合式过电压保护器试验

三相组合式过电压保护器试验 试验目的 三相组合式过电压保护器主要分为有带串联间隙过压保护器和无间隙过压保护器两大类&#xff0c;其试验项目内容要求分别使用高压工频交流和高压直流电源。 三相组合式过电压保护器试验&#xff0c;主要是为了及早发现设备内部绝缘受潮及…

华为云云耀云服务器L实例评测|云耀云服务器L实例部署Dashdot服务器仪表盘

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例部署Dashdot服务器仪表盘 一、云耀云服务器L实例介绍二、Dashdot介绍2.1 Dashdot简介2.2 开发环境要求2.3 Yarn介绍 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、检查服务器环境4.1 购买云耀云服务器L实例…

Android中的缓存策略:LruCache和DiskLruCache

Android中的缓存策略&#xff1a;LruCache和DiskLruCache 导言 本篇文章主要是介绍Android中内置的两个缓存类的原理。所谓缓存&#xff0c;就是将获取的数据保存下来以便下次继续使用&#xff0c;这种技术尤其在网络请求和图片加载中有用&#xff0c;可以显著地提升App的性能…

SSM - Springboot - MyBatis-Plus 全栈体系(十三)

第三章 MyBatis 一、MyBatis 简介 1. 简介 MyBatis 最初是 Apache 的一个开源项目 iBatis, 2010 年 6 月这个项目由 Apache Software Foundation 迁移到了 Google Code。随着开发团队转投 Google Code 旗下&#xff0c; iBatis3.x 正式更名为 MyBatis。代码于 2013 年 11 月迁…