c++中操作数据库的常用函数

在C++中操作数据库,尤其是MySQL数据库,主要通过MySQL提供的C API或MySQL Connector/C++库来实现。这些库提供了一系列的函数,使得开发者能够在C++应用程序中执行数据库的连接、查询、更新、删除等操作。以下是C++中操作MySQL数据库的一些常用函数,以及它们的功能和使用方法。

连接数据库

1. mysql_init

初始化一个MySQL连接句柄,为后续的数据库操作做准备。

 

cpp

深色版本

MYSQL *mysql_init(MYSQL *mysql);

如果传入 NULL,函数会自动分配一个 MYSQL 对象。如果初始化失败,返回 NULL

1

2. mysql_real_connect

尝试建立到MySQL服务器的连接。

 

cpp

深色版本

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag);
  • mysql: 由 mysql_init 初始化的句柄。
  • host: 连接的MySQL服务器的地址。
  • user: 连接的服务器的用户名。
  • passwd: 连接的服务器的密码。
  • db: 默认选择的数据库名称。
  • port: 连接的服务器的端口,默认为3306。
  • unix_socket: 通信管道或socket,通常设为 NULL
  • client_flag: 客户端标志位,通常设为 0

如果连接成功,返回句柄;失败返回 NULL

1

设置字符集

3. mysql_set_character_set

设置当前客户端的字符集,以确保字符编码的一致性。

 

cpp

深色版本

int mysql_set_character_set(MYSQL *mysql, const char *csname);
  • mysql: 初始化完成的句柄。
  • csname: 字符集名称,如 "utf8"

成功返回 0,失败返回非零值。

1

执行SQL语句

4. mysql_query

执行一个SQL语句。

 

cpp

深色版本

int mysql_query(MYSQL *mysql, const char *stmt_str);
  • mysql: 初始化完成的句柄。
  • stmt_str: 要执行的SQL语句。

成功返回 0,失败返回非零值。

1

5. mysql_real_query

类似于 mysql_query,但允许执行包含二进制数据的语句。

 

cpp

深色版本

int mysql_real_query(MYSQL *mysql, const char *stmt_str, unsigned long length);
  • length: SQL语句的长度。

成功返回 0,失败返回非零值。

9

处理查询结果

6. mysql_store_result

保存查询结果到本地。

 

cpp

深色版本

MYSQL_RES *mysql_store_result(MYSQL *mysql);
  • mysql: 初始化完成的句柄。

成功返回结果集的指针,失败返回 NULL

1

7. mysql_fetch_row

遍历结果集,获取单行数据。

 

cpp

深色版本

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
  • result: 保存到本地的结果集地址。

返回值是一个 char ** 类型的指针,将每条数据做成了字符串指针数组,row[0] 为第一列,row[1] 为第二列,依此类推。

1

8. mysql_num_rows

获取结果集中的行数。

 

cpp

深色版本

uint64_t mysql_num_rows(MYSQL_RES *result);
  • result: 保存到本地的结果集地址。

返回结果集中数据的条数。

1

9. mysql_num_fields

获取结果集中列的个数。

 

cpp

深色版本

unsigned int mysql_num_fields(MYSQL_RES *result);
  • result: 保存到本地的结果集地址。

返回结果集中每条数据的列数。

1

清理资源

10. mysql_free_result

释放结果集资源。

 

cpp

深色版本

void mysql_free_result(MYSQL_RES *result);
  • result: 保存到本地的结果集地址。

没有返回值。

1

11. mysql_close

关闭数据库客户端连接,销毁句柄。

 

cpp

深色版本

void mysql_close(MYSQL *mysql);
  • mysql: 初始化完成的句柄。

没有返回值。

1

错误处理

12. mysql_error

获取MySQL接口执行错误的原因。

 

cpp

深色版本

const char *mysql_error(MYSQL *mysql);
  • mysql: 初始化完成的句柄。

返回错误信息的字符串。

1

示例代码

以下是一个简单的示例,展示了如何使用上述函数连接MySQL数据库、执行查询并处理结果集。

 

cpp

深色版本

#include <iostream>
#include <mysql.h>int main() {MYSQL *conn = mysql_init(NULL);// 连接数据库if (!mysql_real_connect(conn, "localhost", "root", "password", "testdb", 0, NULL, 0)) {std::cerr << "Error connecting to database: " << mysql_error(conn) << std::endl;return 1;}// 设置字符集if (mysql_set_character_set(conn, "utf8") != 0) {std::cerr << "Error setting character set: " << mysql_error(conn) << std::endl;return 1;}// 执行查询if (mysql_query(conn, "SELECT * FROM users")) {std::cerr << "Error executing query: " << mysql_error(conn) << std::endl;return 1;}// 保存查询结果MYSQL_RES *result = mysql_store_result(conn);if (result == NULL) {std::cerr << "Error storing result: " << mysql_error(conn) << std::endl;return 1;}// 获取结果集中的行数和列数unsigned int num_fields = mysql_num_fields(result);unsigned int num_rows = mysql_num_rows(result);std::cout << "Number of rows: " << num_rows << std::endl;std::cout << "Number of fields: " << num_fields << std::endl;// 遍历结果集MYSQL_ROW row;while ((row = mysql_fetch_row(result))) {for (unsigned int i = 0; i < num_fields; i++) {std::cout << row[i] << "\t";}std::cout << std::endl;}// 释放结果集资源mysql_free_result(result);// 关闭数据库连接mysql_close(conn);return 0;
}

总结

通过上述函数,C++开发者可以方便地在应用程序中实现与MySQL数据库的交互。这些函数涵盖了从连接数据库到执行查询、处理结果集再到清理资源的完整流程,为开发者提供了强大的工具来管理和操作数据库数据。

1

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

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

相关文章

Java 获取本机 IP 地址的方法

文章目录 一、使用 InetAddress.getLocalHost二、遍历网络接口获取 在 Java 编程中&#xff0c;若有本机的 IP 地址的需求&#xff0c;小编来展示一下方法&#xff1a; 一、使用 InetAddress.getLocalHost 一是最基本的获取本机 IP 地址的方式。 示例代码&#xff1a; impo…

⭐ Unity 资源管理解决方案:Addressable_ Demo演示

一、使用Addressable插件的好处&#xff1a; 1.自动管理依赖关系 2.方便资源卸载 3.自带整合好的资源管理界面 4.支持远程资源加载和热更新 二、使用步骤 安装组件 1.创建资源分组 2.将资源加入资源组 3.打包资源 4.加载资源 三种方式可以加载 using System.Collections…

C++《二叉搜索树》

在初阶数据结构中我学习了树基础的概念以及了解了顺序结构的二叉树——堆和链式结构二叉树该如何实现&#xff0c;那么接下来我们将进一步的学习二叉树&#xff0c;在此会先后学习到二叉搜索树、AVL树、红黑树&#xff1b;通过这些的学习将让我们更易于理解后面set、map、哈希等…

使用go实现流式输出

流式输出的深度剖析 之前一直在调用openai的key&#xff0c;只是照着文档进行流式调用&#xff0c;也只知其确是流式与api有所不同&#xff0c;而未成体系深究其实现原理。 就以openai的官方流式输出为切入。 概述 流式输出&#xff08;Streaming Output&#xff09;是 HTT…

使用VisualStudio编写C++程序输出helloWorld

文章目录 1. C简介1.1 历史背景1.2 特点1.3 应用领域 2. 操作过程和代码2.1 打开Visual Studio(默认你下载了C的相关文件)2.2 创建新项目2.3 输入名字&#xff0c;创建2.4 右击源文件->添加->新建项2.5 命名好&#xff0c;进行添加2.6 输入代码2.7 输出结果 3. 总结 1. C…

万能的无人机锁定目标投放程序

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

LayaBox1.8.4实现UV滚动

实现思路&#xff1a; 在片元着色器采样时&#xff0c;增加一个随时间变化的偏移值&#xff0c;由于uv是一个二维向量所以加的偏移值也需要一个二维向量。注意&#xff1a;在Laya的 shader中除了0&#xff0c;输入其它数字必须输入带有小数的数字&#xff0c;否则报错 。 &quo…

Next.js- App Router 概览

#题引&#xff1a;我认为跟着官方文档学习不会走歪路 一&#xff1a;App Router与Page Router 在 v13 版本中&#xff0c;Next.js 引入了一个基于 React 服务器组件 构建的新的 App Router&#xff0c;而在这之前&#xff0c;Next.js 使用的是Page Router。 目录结构 pages …

Android studio与JS交互

文章目录 前言一、html二、使用步骤1.2.AS 总结 前言 最近在使用Android Studio的WebView,有些功能要AS与JS交互。 一、html html文件 <!DOCTYPE html> <html> <!--javascript--> <head><meta charset"utf-8"><title>Carson…

【LeetCode面试150】——228汇总区间

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…

CPU性能优化--采集调用栈

我们可能经常会遇到程序中热点函数被多个调用者调用的情况&#xff0c;这样就需要知道哪个函数调用foo的次数最多&#xff0c;应用程序的库函数出现在热点处。要理解为什么特定函数会呈现为热点&#xff0c;我们需要知道程序的控制流图中的哪条路径是最热的。 Intel VTune prof…

简单测试下faiss 检索速度

在NLP的应用中&#xff0c;经常需要用到对向量的搜索&#xff0c;如果向量的数量级非常大&#xff0c;比如1千万&#xff0c;甚至上亿条&#xff0c;普通的方式就满足不了生产需要了&#xff0c;falcebook开源的faiss框架能够解决“海量向量搜索”的问题。faiss是为稠密向量提供…

milvus es

ES 与 Milvus 结合实现高效文档搜索的实战指南 原文链接 目录 背景介绍场景与效果概述架构对比与问题分析Milvus 向量搜索架构ES Milvus 搜索架构详细流程解析Milvus 搜索配置详解ES 搜索策略与 DSL 配置结果合并与排序策略总结与未来优化 1. 背景介绍 随着团队和公司的发…

Flutter 设计模式全面解析:抽象工厂

设计模式作为软件开发中的经典解决方案&#xff0c;在 Flutter 的开发中也能为我们提供强大的架构支持。本文来介绍一下如何在 Flutter 中来实现抽象工厂设计模式&#xff0c;以及如何创建一系列相关或依赖对象并优雅地管理它们之间的复杂依赖关系。 日常开发中我们也能经常看…

AWS IAM 及其功能

IAM 代表身份和访问管理&#xff0c;可帮助控制谁可以进入云、访问 AWS 资源以及进入后可以做什么。 身份&#xff1a; IAM 帮助管理可以与 AWS 资源交互的身份&#xff08;如用户名或服务帐户&#xff09;。 访问&#xff1a;它决定每个身份可以在 AWS 服务上执行哪些操作&am…

SpringBoot集成Minio实现上传凭证、分片上传、秒传和断点续传

总体概述 Spring Boot整合Minio后&#xff0c;前端的文件上传有两种方式&#xff1a; 1.文件上传到后端&#xff0c;由后端保存到Minio 这种方式好处是完全由后端集中管理&#xff0c;可以很好的做到、身份验证、权限控制、文件与处理等&#xff0c;并且可以做一些额外的业务逻…

『 Linux 』网络层 - IP协议 (二)

文章目录 路由NAT技术分片与组装分片的组装IP协议分片的短板 路由 通常情况路由器具备了一个非常重要的功能,即构建子网; 同时路由器需要实现跨网络通信,说明路由器必须存在两个或以上的IP地址,通常在路由器中可以看到几个接口,分别是一个WAN口和几个LAN口; WAN口IP被称为公网I…

深度学习实战图像缺陷修复

这里写目录标题 概述1. 图像缺陷修复的研究背景2. 传统图像缺陷修复方法的局限性(1) 基于纹理合成的方法(2) 基于偏微分方程&#xff08;PDE&#xff09;的方法 3. 深度学习在图像缺陷修复中的兴起(1) 深度学习的基本思路(2) 深度学习方法的优势(3) 关键技术的引入 4. 深度学习…

vue从入门到精通(七):事件处理

1&#xff0c;事件的基本使用 1.使用v-on:xxx或 xxx 绑定事件&#xff0c;其中xxx是事件名2.事件的回调需要配置在methods对象中&#xff0c;最终会在vm上3.methods中配置的所数&#xff0c;不要用箭头函数!否则this就不是vm了4.methods中配置的函数&#xff0c;都是被Vue所管…

如何在 .gitignore 中仅保留特定文件:以忽略文件夹中的所有文件为例

在日常的开发工作中&#xff0c;使用 Git 来管理项目是不可或缺的一部分。项目中的某些文件夹可能包含大量的临时文件、生成文件或不需要版本控制的文件。在这种情况下&#xff0c;我们通常会使用 .gitignore 文件来忽略这些文件夹。然而&#xff0c;有时我们可能希望在忽略整个…