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

【C/C++】数据库链接入门教程:从零开始的详细指南!MySQL集成与操作

文章目录

    • 环境配置:搭建开发环境的基础步骤
      • 2.1 安装MySQL数据库
      • 2.2 配置C/C++开发环境
      • 2.3 下载并安装MySQL Connector/C++
    • 基础操作:实现C/C++与MySQL的基本交互
      • 3.1 建立数据库连接
      • 3.2 执行SQL语句
      • 3.3 处理查询结果
    • 进阶技巧:提升数据库操作效率与安全性
      • 4.1 使用预处理语句防止SQL注入
      • 4.2 事务管理
      • 4.3 错误处理与日志记录
    • 更多:实用文章
    • 常见问题与解决方案
      • Q1: 无法连接到数据库,提示“Access denied”
      • Q2: 编译时报错找不到头文件
      • Q3: 执行SQL语句时出现语法错误
      • Q4: 程序崩溃或内存泄漏
    • 结尾

环境配置:搭建开发环境的基础步骤

在开始编写代码之前,首先需要搭建一个适合C/C++开发并能够连接MySQL数据库的环境。以下是详细的配置步骤。

2.1 安装MySQL数据库

首先,确保您的系统中已安装MySQL数据库。如果尚未安装,可以按照以下步骤进行安装:

Windows系统:

  1. 前往MySQL官网下载适用于Windows的MySQL安装包。
  2. 运行安装程序,按照向导完成安装。在安装过程中,记下设置的root密码。
  3. 安装完成后,可以通过MySQL Command Line Client或MySQL Workbench进行数据库管理。

体验最新的GPT系列模型!支持Open API调用、自定义助手、文件上传等强大功能,助您提升工作效率!点击链接体验:CodeMoss & ChatGPT-AI中文版

在这里插入图片描述

2.2 配置C/C++开发环境

确保您的开发环境中已安装C/C++编译器和必要的开发工具:

Windows系统:

  • 使用Visual Studio进行C/C++开发。
  • 配置环境变量,确保编译器可在命令行中访问。

2.3 下载并安装MySQL Connector/C++

MySQL Connector/C++是MySQL官方提供的C++连接器,用于在C++应用程序中实现MySQL数据库操作。

在这里插入图片描述

下载步骤:

  1. 前往MySQL Connector/C++下载页面。
  2. 根据您的操作系统选择合适的版本下载。
  3. 按照下载的文档进行安装和配置。

配置示例:

假设您下载并解压了Connector/C++,需要将其包含目录和库文件路径添加到您的项目中。例如,在Linux系统中,可以将库路径添加到LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/path/to/mysql-connector-c++-x.x.x/lib:$LD_LIBRARY_PATH

在Windows系统中,需要将DLL文件所在目录添加到系统PATH中。

基础操作:实现C/C++与MySQL的基本交互

完成环境配置后,接下来我们将编写C++代码,实现在C++程序中连接MySQL数据库并执行基本的SQL操作。

3.1 建立数据库连接

首先,编写代码以连接到MySQL数据库。这需要包含MySQL Connector/C++的头文件,并使用其提供的接口进行连接。

示例代码:

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <mysql_driver.h>
#include <mysql_connection.h>
#include <iostream>int main() {try {sql::mysql::MySQL_Driver *driver;sql::Connection *con;// 获取驱动driver = sql::mysql::get_mysql_driver_instance();// 建立连接con = driver->connect("tcp://127.0.0.1:3306", "root", "your_password");// 选择数据库con->setSchema("testdb");std::cout << "连接成功!" << std::endl;// 释放资源delete con;} catch (sql::SQLException &e) {std::cerr << "错误:" << e.what() << std::endl;return EXIT_FAILURE;}return EXIT_SUCCESS;
}

说明:

  • get_mysql_driver_instance()用于获取MySQL驱动实例。
  • connect方法用于建立连接,第一个参数为数据库地址和端口,第二、三个参数为用户名和密码。
  • setSchema用于选择要操作的数据库。

3.2 执行SQL语句

连接建立后,可以通过Statement对象执行SQL语句,如创建表、插入数据等。

示例代码:

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <mysql_driver.h>
#include <mysql_connection.h>
#include <iostream>int main() {try {sql::mysql::MySQL_Driver *driver;sql::Connection *con;sql::Statement *stmt;driver = sql::mysql::get_mysql_driver_instance();con = driver->connect("tcp://127.0.0.1:3306", "root", "your_password");con->setSchema("testdb");stmt = con->createStatement();// 创建表stmt->execute("CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), age INT)");// 插入数据stmt->execute("INSERT INTO users (name, age) VALUES ('Alice', 30)");stmt->execute("INSERT INTO users (name, age) VALUES ('Bob', 25)");std::cout << "表创建及数据插入成功!" << std::endl;delete stmt;delete con;} catch (sql::SQLException &e) {std::cerr << "错误:" << e.what() << std::endl;return EXIT_FAILURE;}return EXIT_SUCCESS;
}

说明:

  • createStatement方法用于创建Statement对象。
  • 通过execute方法执行SQL语句,如CREATE TABLEINSERT INTO

3.3 处理查询结果

查询数据后,需要处理返回的结果集。可以使用ResultSet对象来遍历和操作查询结果。

示例代码:

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <mysql_driver.h>
#include <mysql_connection.h>
#include <iostream>int main() {try {sql::mysql::MySQL_Driver *driver;sql::Connection *con;sql::Statement *stmt;sql::ResultSet *res;driver = sql::mysql::get_mysql_driver_instance();con = driver->connect("tcp://127.0.0.1:3306", "root", "your_password");con->setSchema("testdb");stmt = con->createStatement();// 查询数据res = stmt->executeQuery("SELECT id, name, age FROM users");// 处理结果while (res->next()) {int id = res->getInt("id");std::string name = res->getString("name");int age = res->getInt("age");std::cout << "ID: " << id << ", Name: " << name << ", Age: " << age << std::endl;}delete res;delete stmt;delete con;} catch (sql::SQLException &e) {std::cerr << "错误:" << e.what() << std::endl;return EXIT_FAILURE;}return EXIT_SUCCESS;
}

说明:

  • executeQuery方法用于执行SELECT语句,并返回结果集。
  • 通过ResultSet对象的next方法遍历每一行数据。
  • 使用getIntgetString方法获取列数据。

进阶技巧:提升数据库操作效率与安全性

在掌握了基本的数据库操作后,下一步是优化代码,提高操作效率及确保安全性。

在这里插入图片描述

4.1 使用预处理语句防止SQL注入

SQL注入是一种常见的安全漏洞,通过预处理语句可以有效防止此类攻击。

示例代码:

#include <cppconn/prepared_statement.h>
// 其他包含头文件同上int main() {try {// 连接与选择数据库同上sql::PreparedStatement *pstmt;pstmt = con->prepareStatement("INSERT INTO users (name, age) VALUES (?, ?)");// 设置参数pstmt->setString(1, "Charlie");pstmt->setInt(2, 28);pstmt->execute();pstmt->setString(1, "Diana");pstmt->setInt(2, 22);pstmt->execute();std::cout << "预处理语句插入成功!" << std::endl;delete pstmt;delete con;} catch (sql::SQLException &e) {// 错误处理同上}return EXIT_SUCCESS;
}

说明:

  • prepareStatement方法用于创建预处理语句,使用?作为参数占位符。
  • 通过setStringsetInt方法设置参数值,避免了直接拼接SQL语句带来的安全隐患。

4.2 事务管理

在需要执行多个相关操作时,使用事务可以确保数据的一致性和完整性。

示例代码:

int main() {try {// 连接与选择数据库同上// 禁用自动提交con->setAutoCommit(false);sql::PreparedStatement *pstmt1;sql::PreparedStatement *pstmt2;pstmt1 = con->prepareStatement("INSERT INTO users (name, age) VALUES (?, ?)");pstmt2 = con->prepareStatement("UPDATE users SET age = ? WHERE name = ?");// 第一个操作pstmt1->setString(1, "Eve");pstmt1->setInt(2, 35);pstmt1->execute();// 第二个操作pstmt2->setInt(1, 36);pstmt2->setString(2, "Eve");pstmt2->execute();// 提交事务con->commit();std::cout << "事务执行成功!" << std::endl;delete pstmt1;delete pstmt2;delete con;} catch (sql::SQLException &e) {// 回滚事务con->rollback();std::cerr << "事务失败,已回滚:" << e.what() << std::endl;return EXIT_FAILURE;}return EXIT_SUCCESS;
}

说明:

  • 通过setAutoCommit(false)禁用自动提交,手动控制事务。
  • try块中执行多个操作,最后调用commit提交事务。
  • catch块中调用rollback回滚事务,确保数据一致性。

4.3 错误处理与日志记录

良好的错误处理机制和日志记录有助于快速定位和解决问题。

示例代码:

#include <fstream>
// 其他包含头文件同上int main() {std::ofstream logFile("error.log", std::ios::app);try {// 连接与数据库操作同上} catch (sql::SQLException &e) {logFile << "错误:" << e.what() << ",状态码:" << e.getErrorCode() << std::endl;std::cerr << "发生错误,请查看日志文件。" << std::endl;return EXIT_FAILURE;}logFile.close();return EXIT_SUCCESS;
}

说明:

  • 使用std::ofstream将错误信息记录到日志文件中。
  • catch块中捕获异常并记录详细信息,方便后续排查。

更多:实用文章

【OpenAI】获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!!

【IDER、PyCharm】免费AI编程工具完整教程:ChatGPT Free - Support Key call AI GPT-o1 Claude3.5

【VScode】VSCode中的智能编程利器,全面揭秘ChatMoss & ChatGPT中文版

常见问题与解决方案

在实际开发过程中,您可能会遇到各种问题,以下列举几种常见问题及解决方案:

在这里插入图片描述

Q1: 无法连接到数据库,提示“Access denied”

解决方案:

  • 检查用户名和密码是否正确。
  • 确认MySQL服务器正在运行。
  • 确认用户有相应的访问权限,尤其是从指定的主机(如localhost)进行连接。

Q2: 编译时报错找不到头文件

解决方案:

  • 确认MySQL Connector/C++已正确安装。
  • 检查编译器的包含目录是否正确配置,确保头文件路径已添加。
  • 确认链接器的库路径是否正确配置,确保库文件路径已添加。

Q3: 执行SQL语句时出现语法错误

解决方案:

  • 检查SQL语句的语法是否正确。
  • 使用MySQL客户端(如MySQL Workbench)手动执行语句,确认其有效性。
  • 确认表名、字段名是否正确,避免拼写错误。

Q4: 程序崩溃或内存泄漏

解决方案:

  • 确保所有通过new分配的对象都通过delete释放,避免内存泄漏。
  • 使用智能指针(如std::unique_ptr)管理资源,确保自动释放。
  • 检查指针的使用,避免空指针引用或悬挂指针。

结尾

希望本篇《C/C++数据库链接全攻略:从零开始轻松掌握MySQL集成与操作》能为您在C/C++与MySQL数据库的连接与操作上提供实用的指导和帮助。如果您在实践过程中遇到任何问题,欢迎在下方评论区留言,我们将共同探讨解决方案。同时,别忘了关注我的CSDN账号,获取更多关于C/C++编程和数据库开发的精彩内容!

相关文章:

【C/C++】数据库链接入门教程:从零开始的详细指南!MySQL集成与操作

文章目录 环境配置&#xff1a;搭建开发环境的基础步骤2.1 安装MySQL数据库2.2 配置C/C开发环境2.3 下载并安装MySQL Connector/C 基础操作&#xff1a;实现C/C与MySQL的基本交互3.1 建立数据库连接3.2 执行SQL语句3.3 处理查询结果 进阶技巧&#xff1a;提升数据库操作效率与安…...

C#中面试的常见问题005

1、重载和重写 重载&#xff08;Overloading&#xff09; 重载是指在同一个类中定义多个同名方法&#xff0c;但参数列表不同&#xff08;参数的数量、类型或顺序不同&#xff09;。返回类型可以相同也可以不同。重载方法允许你根据传入的参数类型和数量来调用不同的方法。 …...

使用Redis生成全局唯一id

为了生成一个符合要求的分布式全局ID&#xff0c;我们可以使用 StringRedisTemplate 来实现。这个ID由三部分组成&#xff1a; 符号位&#xff08;1 bit&#xff09;&#xff1a;始终为0&#xff0c;表示正数。时间戳&#xff08;31 bit&#xff09;&#xff1a;表示从某个起始…...

pnpm:包管理的新星,平替 npm 和 yarn

​ pnpm&#xff0c;一个老牌的 node.js 包管理器&#xff0c;支持 npm 的所有功能&#xff0c;完全足以用来替代 npm。它采用全局存储&#xff0c;每个项目内部使用了硬链接&#xff0c;所以很省空间&#xff0c;安装速度快。 本文介绍下 pnpm 的基本概念&#xff0c;安装、…...

Android调起系统分享图片到其他应用

Android调起系统分享图片到其他应用 有时候分享不想接第三方的&#xff0c;其实如果你的分享要求不是很高&#xff0c;调系统的分享也是可以的。 一、思路&#xff1a; 用intent.action Intent.ACTION_SEND 二、效果图&#xff1a; 三、关键代码&#xff1a; //这个是分享…...

详解Qt QBuffer

文章目录 **QBuffer 的详解****前言****QBuffer 是什么&#xff1f;****QBuffer 的主要用途****构造函数****主要成员函数详解****1. open()****原型&#xff1a;****作用&#xff1a;****参数&#xff1a;****返回值&#xff1a;****示例代码&#xff1a;** **2. write()****原…...

Python基础学习-11函数参数

1、"值传递” 和“引用传递” 1&#xff09;不可变的参数通过“值传递”。比如整数、字符串等 2&#xff09;可变的参数通过“引用参数”。比如列表、字典。 3&#xff09;避免可变参数的修改 4&#xff09;内存模型简介 2、函数参数类型 1&#xff09; def func() #无参…...

GTK#框架让C# Winform程序跨平台运行

在软件开发领域&#xff0c;跨平台能力是一个重要的考量因素。对于C#开发者来说&#xff0c;Winform是构建桌面应用的强大工具&#xff0c;但原生Winform只支持Windows平台。幸运的是&#xff0c;GTK#框架的出现让C# Winform程序跨平台运行成为可能。本文将详细介绍如何使用GTK…...

在Kubernetes使用CronJob实现定时删除指定天数外的文件(我这里使用删除备份mysql数据库文件为例)

文章目录 一、代码使用方式1、golang代码2、使用方法二、容器镜像使用方式1、制作镜像2、我公开的镜像3、使用方法一、代码使用方式 1、golang代码 vim cleanfile.go package mainimport ("flag""fmt""io/ioutil""os""path/fi…...

使用 Elastic 收集 Windows 遥测数据:ETW Filebeat 输入简介

作者&#xff1a;来自 Elastic Chema Martinez 在安全领域&#xff0c;能够使用 Windows 主机的系统遥测数据为监控、故障排除和保护 IT 环境开辟了新的可能性。意识到这一点&#xff0c;Elastic 推出了专注于 Windows 事件跟踪 (ETW) 的新功能 - 这是一种强大的 Windows 原生机…...

力扣-位运算-4【算法学习day.44】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…...

Stable Diffusion 3详解

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…...

c#异步编程(async/await)

注&#xff1a;下文摘自ChatGPT&#xff0c;总结与案例都非常完善&#xff0c;可以快速理解并应用 0&#xff1a;使用场景 在winform界面程序中&#xff0c;在ui操作中涉及到一些耗时的等待操作&#xff0c;使用线程自己处理已经显得力不从心&#xff0c;如何能更好的实现&am…...

TCP/IP学习笔记

TCP\IP从实际应用的五层结构开始&#xff0c;自顶而下的去分析每一层。 TCP/IP五层架构概述 学术上面是TCP/IP四层架构&#xff0c;OSI/ISO是七层架构&#xff0c;实际中使用的是TCP/IP五层架构。 数据链路层 ICMP数据包分析 Wireshark抓包分析ICMP协议_wireshark抓ping包分析…...

0000_vim自定义快捷键_alias

vim自定义快捷键_alias 如下&#xff1a; 1.直接打开vi ~/.bashrc 然后到最底部&#xff0c;添加alias快捷键 2.添加alias快捷键mgplat 以后只要发送mgplat就等于出发了那么长一条指令 3.保存退出即可 【注意】 操作完后&#xff0c;可能你用mgplat无法使用&#xff0c;可…...

Spring Boot项目中,实体类是否需要实现Serializable接口

在Spring Boot项目中&#xff0c;实体类是否需要实现Serializable接口并不是一个硬性规定&#xff0c;而是取决于具体的应用场景和需求。以下是对这一问题的更详细分析&#xff1a; 1. 序列化的基本概念 序列化是将对象的状态信息转换为可以存储或传输的形式的过程。反序列化则…...

打通工业通信壁垒实现Ethernetip转profinet网络互通

西门子S7-1500 PLC&#xff08;profinet&#xff09;与AB PLC 1769-L32E以太网通讯&#xff08;EtherNet/IP&#xff09;。今天与大家分享一篇Profinet转EtherNet/IP的通讯配置方案。本文主要介绍开疆智能的Profinet转EtherNet/IP网关KJ-PNG-208&#xff0c;连接西门子S7-1500 …...

数据结构_图的应用

最小生成树 Prim算法 int AMGraph::sum(string v) {int start, totalW, cnt, minW, u, vv, i, j;start LocateVex(v); // 获取起始顶点编号memset(visited, false, sizeof(visited)); // 初始化访问状态visited[start] true;totalW 0; // 最小生成树的总权重cnt 1; // 当前…...

C#中面试的常见问题002

1.wpf和Winfrom的区别 1. 技术基础 WPF&#xff1a;基于.NET Framework&#xff0c;使用XAML&#xff08;可扩展应用程序标记语言&#xff09;作为界面描述语言&#xff0c;支持矢量图形和高级布局。WinForms&#xff1a;基于.NET Framework&#xff0c;使用纯代码或拖放设计…...

快速理解微服务中Ribbon的概念

一.基本概念 1.在微服务架构中&#xff0c;Ribbon 是一个客户端负载均衡器&#xff0c;用于控制服务间的通信方式。 2.Ribbon 是一个开源的库&#xff0c;最早由 Netflix 开发&#xff0c;用于实现客户端负载均衡。 3.Ribbon 主要解决的是在微服务架构中&#xff0c;多个服务…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...

背包问题双雄:01 背包与完全背包详解(Java 实现)

一、背包问题概述 背包问题是动态规划领域的经典问题&#xff0c;其核心在于如何在有限容量的背包中选择物品&#xff0c;使得总价值最大化。根据物品选择规则的不同&#xff0c;主要分为两类&#xff1a; 01 背包&#xff1a;每件物品最多选 1 次&#xff08;选或不选&#…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...