CC++链接数据库(MySQL)超级详细指南

C/C++链接数据库(MySQL)超级详细指南

在C/C++编程中,与数据库进行交互是一项常见的任务。MySQL作为一个广泛使用的开源关系型数据库管理系统,提供了丰富的API供C/C++开发者使用。本文将详细介绍如何在C/C++程序中链接MySQL数据库,包括环境配置、库文件引入、连接数据库、执行SQL语句、处理查询结果等关键步骤。

一、环境配置

在使用C/C++链接MySQL数据库之前,需要确保你的开发环境中已经安装了MySQL数据库以及相应的开发库。

  1. 安装MySQL

    前往MySQL官网,根据你的操作系统下载并安装MySQL服务器。安装过程中,请确保选择包含开发库(如MySQL Connector/C)的选项。

  2. 配置开发环境

    • Windows
      在Windows上,安装MySQL后,开发库通常位于MySQL安装目录下的libinclude文件夹中。你需要在你的C/C++项目中配置这些路径,以便编译器和链接器能够找到MySQL的头文件和库文件。

    • Linux
      在Linux上,你可以通过包管理器(如apt-get、yum等)安装MySQL开发库。例如,在Ubuntu上,你可以使用以下命令安装:

      sudo apt-get install libmysqlclient-dev
      

      安装后,头文件通常位于/usr/include/mysql,库文件位于/usr/lib/x86_64-linux-gnu/(路径可能因系统和MySQL版本而异)。

二、库文件引入

在你的C/C++项目中,你需要引入MySQL的头文件,并在编译时链接MySQL的库文件。

  1. 包含头文件

    在你的C/C++源文件中,包含MySQL的头文件:

    #include <mysql.h>
    
  2. 配置项目

    • Visual Studio
      在Visual Studio中,你需要通过项目属性配置包含目录和库目录,以及附加依赖项。

      • 右键点击项目 -> 属性 -> 配置属性 -> VC++目录 -> 包含目录,添加MySQL的include路径。
      • 配置属性 -> VC++目录 -> 库目录,添加MySQL的lib路径。
      • 配置属性 -> 链接器 -> 输入 -> 附加依赖项,添加libmysql.lib(Windows上)或mysqlclient(Linux上,可能需要添加前缀和后缀,如-lmysqlclient)。
    • Linux
      在Linux上,你通常使用g++或clang++进行编译。编译时,你需要使用-I选项指定头文件路径,使用-L选项指定库文件路径,并使用-l选项链接库文件。例如:

      g++ -o my_program my_program.cpp -I/usr/include/mysql -L/usr/lib/x86_64-linux-gnu/ -lmysqlclient
      
三、连接数据库

在C/C++中,连接MySQL数据库通常使用mysql_real_connect函数。

  1. 初始化MySQL对象

    在连接数据库之前,你需要初始化一个MySQL对象:

    MYSQL *conn = mysql_init(NULL);
    if (conn == NULL) {fprintf(stderr, "mysql_init() failed
    ");exit(1);
    }
    
  2. 连接数据库

    使用mysql_real_connect函数连接数据库:

    if (mysql_real_connect(conn, "host", "user", "password", "database", 0, NULL, 0) == NULL) {fprintf(stderr, "mysql_real_connect() failed
    ");mysql_close(conn);exit(1);
    }
    

    其中,"host"是数据库服务器的地址,"user"是数据库用户名,"password"是数据库密码,"database"是要连接的数据库名称。

四、执行SQL语句

连接数据库后,你可以使用mysql_querymysql_real_query函数执行SQL语句。

  1. 执行SQL查询

    使用mysql_query执行简单的SQL查询:

    if (mysql_query(conn, "SELECT * FROM table_name")) {fprintf(stderr, "SELECT * error: %s
    ", mysql_error(conn));mysql_close(conn);exit(1);
    }
    
  2. 处理查询结果

    使用mysql_store_resultmysql_use_result函数获取查询结果。mysql_store_result会将整个结果集加载到内存中,适用于结果集较小的情况;mysql_use_result则逐行处理结果集,适用于结果集较大的情况。

    • 使用mysql_store_result

      MYSQL_RES *result = mysql_store_result(conn);
      if (result == NULL) {fprintf(stderr, "mysql_store_result() failed. Error: %s
      ", mysql_error(conn));mysql_close(conn);exit(1);
      }int num_fields = mysql_num_fields(result);
      MYSQL_ROW row;while ((row = mysql_fetch_row(result))) {for(int i = 0; i < num_fields; i++) {printf("%s ", row[i] ? row[i] : "NULL");}printf("
      ");
      }mysql_free_result(result);
      
    • 使用mysql_use_result

      MYSQL_RES *result = mysql_use_result(conn);
      if (result == NULL) {fprintf(stderr, "mysql_use_result() failed. Error: %s
      ", mysql_error(conn));mysql_close(conn);exit(1);
      }MYSQL_ROW row;
      while ((row = mysql_fetch_row(result))) {// 处理每一行数据
      }mysql_free_result(result);
      
五、关闭数据库连接

在完成数据库操作后,你需要关闭数据库连接以释放资源。

mysql_close(conn);
六、错误处理

在处理数据库操作时,你应该始终检查每个函数的返回值,并在出现错误时打印错误信息。MySQL的API提供了mysql_error函数来获取最近一次操作的错误信息。

七、示例程序

以下是一个完整的C++程序示例,它展示了如何连接MySQL数据库、执行查询并处理结果:

#include <mysql.h>
#include <iostream>
#include <cstdlib>int main() {MYSQL *conn;MYSQL_RES *res;MYSQL_ROW row;// 初始化MySQL对象conn = mysql_init(NULL);// 检查初始化是否成功if (conn == NULL) {std::cerr << "mysql_init() failed" << std::endl;exit(1);}// 连接数据库if (mysql_real_connect(conn, "localhost", "root", "password", "database_name", 0, NULL, 0) == NULL) {std::cerr << "mysql_real_connect() failed. Error: " << mysql_error(conn) << std::endl;mysql_close(conn);exit(1);}// 执行SQL查询if (mysql_query(conn, "SELECT * FROM table_name")) {std::cerr << "SELECT * error: " << mysql_error(conn) << std::endl;mysql_close(conn);exit(1);}// 获取查询结果res = mysql_store_result(conn);if (res == NULL) {std::cerr << "mysql_store_result() failed. Error: " << mysql_error(conn) << std::endl;mysql_close(conn);exit(1);}// 处理查询结果int num_fields = mysql_num_fields(res);while ((row = mysql_fetch_row(res))) {for (int i = 0; i < num_fields; i++) {std::cout << (row[i] ? row[i] : "NULL") << " ";}std::cout << std::endl;}// 释放查询结果mysql_free_result(res);// 关闭数据库连接mysql_close(conn);return 0;
}

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

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

相关文章

基于EM期望最大化算法的GMM参数估计与三维数据分类系统python源码

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 EM算法 E步:期望步 M步:最大化步 4.2 GMM模型 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 程序运行配置环境&#xff1a; 人工智能算法…

制服小程序的“滑手”:禁用页面左右滑动全攻略

哈哈&#xff0c;看来你已经很聪明地发现了小程序中左右滑动的“顽皮”行为&#xff01;&#x1f604; 没错&#xff0c;我们可以通过设置 disableScroll 属性来“管教”它&#xff0c;同时结合 CSS 样式让页面既禁得住横向“乱跑”&#xff0c;又能顺畅地上下滚动。你的方案已…

docker学习笔记(1)从安装docker到使用Portainer部署容器

docker学习笔记第一课 先交代背景 docker宿主机系统&#xff1a;阿里云ubuntu22.04 开发机系统&#xff1a;win11 docker镜像仓库&#xff1a;阿里云&#xff0c;此阿里云与宿主机系统没有关系&#xff0c;是阿里云提供的一个免费的docker仓库 代码托管平台&#xff1a;github&…

stable-diffusion-webui 加载模型文件

背景 stable-diffusion-webui 安装完毕后&#xff0c;默认的模型生成的效果图并不理想&#xff0c;可以根据具体需求加载指定的模型文件。国内 modelscope 下载速度较快&#xff0c;以该站为例进行介绍 操作步骤 找到指定的模型文件 在 https://modelscope.cn/models 中查找…

kotlin高级用法总结

Kotlin 是一门功能强大且灵活的编程语言&#xff0c;除了基础语法外&#xff0c;它还提供了许多高级特性&#xff0c;可以帮助你编写更简洁、高效和可维护的代码。以下是 Kotlin 的一些高级用法&#xff0c;涵盖了协程、扩展函数、属性委托、内联类、反射等内容。 协程&#x…

Linux网络 NAT、代理服务、内网穿透

NAT 技术 IPv4 协议中存在 IP 地址数量不充足的问题&#xff0c;而 NAT 技术是当前解决 IP 地址不够用的主要手段 , 是路由器的一个重要功能。NAT 能够将私有 IP 对外通信时转为全局 IP&#xff0c;也就是就是一种将私有 IP 和全局 IP 相互转化的技术方法。 这可以让很多学…

世界模型在塑造自动驾驶中的作用:综述

25年2月来自华中理工和百度的论文“”The Role of World Models in Shaping Autonomous Driving: A Comprehensive Survey“。 驾驶世界模型 (DWM) 专注于预测驾驶过程中的场景演变&#xff0c;已成为实现自动驾驶一个有前途的范例。这些方法使自动驾驶系统能够更好地感知、理…

全向广播扬声器在油气田中的关键应用 全方位守护安全

油气田作为高风险作业场所&#xff0c;安全生产始终是重中之重。在紧急情况下&#xff0c;如何快速、有效地传达信息&#xff0c;确保人员安全撤离&#xff0c;是油气田安全管理的关键环节。全向广播扬声器凭借其全方位覆盖、高音质输出和强大的环境适应性&#xff0c;成为油气…

【AI大模型】AI赋能,使用DeepSeek 高效制作PPT实战详解

目录 一、前言 二、传统 PPT 制作问题 2.1 传统方式制作 PPT 2.2 AI 大模型辅助制作 PPT 2.3 适用场景对比分析 2.4 最佳实践与推荐 三、DeepSeek Kimi 高效制作PPT操作实践 3.1 Kimi 简介 3.2 DeepSeek Kimi 制作PPT优势 3.2.1 DeepSeek 优势 3.2.2 Kimi 制作PPT优…

【51单片机】程序实验13.串口通信

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 开发资料下载链接&#xff1a;http://www.prechin.cn/gongsixinwen/208.html 前置知识&#xff1a;C语言 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 目录 通信的基本概念串行通信与并行通…

论文阅读笔记:ArcFace: Additive Angular Margin Loss for Deep Face Recognition

论文阅读笔记&#xff1a;ArcFace: Additive Angular Margin Loss for Deep Face Recognition 1 背景2 创新点3 方法4 模块4.1 Softmax4.2 权重归一化4.3 乘性角度间隔4.4 特征归一化4.5 加性余弦间隔4.6 加性角度间隔4.7 二值化情况下的比较4.8 目标Logit分析 5 效果5.1 消融实…

代码随想录算法训练营 | 图论 | DFS

98. 所有可达路径// DFS #include <bits/stdc.h> using namespace std;vector<vector<int>> result; vector<int> path;void dfs(const vector<list<int>> &graph, int i, int target) {if (i target) {result.push_back(path);retu…

GPPT: Graph Pre-training and Prompt Tuning to Generalize Graph Neural Networks

GPPT: Graph Pre-training and Prompt Tuning to Generalize Graph Neural Networks KDD22 推荐指数&#xff1a;#paper/⭐⭐#​ 动机 本文探讨了图神经网络&#xff08;GNN&#xff09;在迁移学习中“预训练-微调”框架的局限性及改进方向。现有方法通过预训练&#xff08…

迷你世界脚本方块接口:Block

方块接口&#xff1a;Block 彼得兔 更新时间: 2024-08-27 11:04:56 具体函数名及描述如下&#xff1a; 序号 函数名 函数描述 1 isSolidBlock(...) 是否是固体方块 2 isLiquidBlock(...) 是否是液体方块 3 isAirBlock(...) 是否是气体方块 4 getBl…

Windows下git疑难:有文件无法被跟踪

Windows下git疑难&#xff1a;有文件无法被跟踪 最近在写一个c# WinFrom程序&#xff0c; 奇怪的是&#xff0c;frmMain.cs这个文件一直无法被跟踪 研究了很久&#xff0c; 参考这一篇 https://blog.csdn.net/m0_37315653/article/details/83064810 git rm --cached ./ -r 之…

Live2d官方项目运行

Live2d官方项目运行 1-参考网址 教程网址&#xff1a;https://blog.csdn.net/qq_39123467/article/details/131735085live2d官方地址&#xff1a;https://live2d.com/cubism-sdk/download/ 2-上手实践 1&#xff09;先打开官方项目-全部路径打开2&#xff09;cd /CubismSdkFo…

BUU43 [BJDCTF2020]The mystery of ip 1

前置知识&#xff1a; X - Forwarded - For注入 X - Forwarded - For&#xff08;XFF&#xff09;是一个 HTTP 头字段&#xff0c;用于记录客户端的真实 IP 地址。当客户端请求经过代理服务器时&#xff0c;代理服务器会将客户端的 IP 地址添加到 X - Forwarded - For 头中。…

张岳教授:语言模型推理与泛化研究 | ICLR 2025 特邀报告与团队专场

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; AITIME 01 ICLR 2025预讲会特邀报告 AITIME 02 ICLR 2025预讲会西湖大学张岳老师实验室专场 01 AI生成文本的自动化检测 Glimpse: Enabling White-Box Methods to Use Proprietary Models for Zero-Shot LLM-Ge…

MySQL SQL 优化专题

MySQL SQL 优化专题 1. 插入数据优化 -- 普通插入&#xff08;不推荐&#xff09; INSERT INTO tb_user VALUES(1,tom); INSERT INTO tb_user VALUES(2,cat); INSERT INTO tb_user VALUES(3,jerry);-- 优化方案1&#xff1a;批量插入&#xff08;推荐&#xff0c;不建议超过1…

【AI深度学习基础】NumPy完全指南进阶篇:核心功能与工程实践(含完整代码)

NumPy系列文章 入门篇进阶篇终极篇 一、引言 在掌握NumPy基础操作后&#xff0c;开发者常面临真实工程场景中的三大挑战&#xff1a;如何优雅地处理高维数据交互&#xff1f;如何在大规模计算中实现内存与性能的平衡&#xff1f;怎样与深度学习框架实现高效协同&#xff1f;…