MySQL C API的使用

MySQL C API的使用

介绍及使用

MySQL C API(也称为 MySQL Connector/C)是用于与 MySQL 数据库交互的 C 语言 API。它提供了一组函数和结构体,允许你在 C 程序中连接到 MySQL 数据库服务器,并执行查询、插入、更新等数据库操作。

以下是 MySQL C API 的基本使用步骤:

1. 包含头文件:

在你的 C 代码中包含 MySQL C API 的头文件:

#include <mysql/mysql.h>

2. 初始化和连接:

在程序开始时,需要初始化 MySQL C API 并建立与数据库服务器的连接。以下是一个简单的例子:

// 这个函数初始化MySQL,并返回一个MYSQL指针。这个指针在后续的操作中都会使用到。
MYSQL *conn;
conn = mysql_init(NULL);if (conn == NULL) {fprintf(stderr, "mysql_init() failed\n");exit(1);
}
//连接到数据库:mysql_real_connect()使用这个函数来连接到数据库。其中参数包括上一步得到的MYSQL指针,以及数据库的主机名、用户名、密码、数据库名等。
if (mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0) == NULL) {fprintf(stderr, "mysql_real_connect() failed\n");mysql_close(conn);exit(1);
}
// 补充了解
// 最后三个参数大部分情况下为0,NULL,0即可,三个参数详细介绍如下
port:这是数据库服务端的端口号,默认是MySQL的默认端口3306。如果提供0,将使用默认端口;
unix_socket:这是Unix系统专用的,如果mysql服务器运行在本地,并使用了Unix socket,这个参数就指定了该socket的路径。对于运行在网络上的服务器,此参数通常为NULL;
client_flag:这是额外标志,通常为0。对于特殊情况,可以设置为一些特定的值,比如CLIENT_COMPRESS(在客户端和服务器间进行压缩)CLIENT_SSL(使用ssl连接)CLIENT_LOCAL_FILES(允许LOAD DATA LOCAL操作)等等。详情请查阅MySQL的官方文档。
为了兼容更多的使用场景,mysql_real_connect函数给出了很多参数,适合应对各种复杂的数据库连接情况。但是在实际使用中,大部分情况下,使用默认参数(port为0,unix_socket为NULL,client_flag为0)就足够了。

在这个例子中,使用 mysql_init 初始化 MySQL 对象,然后使用 mysql_real_connect 建立与 MySQL 服务器的连接。你需要提供主机名、用户名、密码和数据库名。

3. 执行查询:

一旦连接建立,你可以执行 SQL 查询。以下是一个简单的查询示例:

//mysql_query()使用这个函数来执行SQL查询。查询结果可以用后续的函数来获取。
if (mysql_query(conn, "SELECT * FROM your_table")) {fprintf(stderr, "SELECT query failed: %s\n", mysql_error(conn));mysql_close(conn);exit(1);
}
//获取查询结果:mysql_store_result() 或 mysql_use_result()这两个函数可以获取查询结果。mysql_store_result()将所有的查询结果存储在客户端,mysql_use_result()则允许你一个接一个地获取结果行。
MYSQL_RES *result = mysql_store_result(conn);		// 注意,返回值是指针
if (result == NULL) {fprintf(stderr, "mysql_store_result() failed\n");mysql_close(conn);exit(1);
}
//遍历结果集:mysql_fetch_row()这个函数可以获取结果集中的一行。你可以在循环中使用它来遍历所有的结果行。
int num_fields = mysql_num_fields(result);
MYSQL_ROW row;		//typedef char **MYSQL_ROW
while ((row = mysql_fetch_row(result))) {for (int i = 0; i < num_fields; i++) {printf("%s ", row[i] ? row[i] : "NULL");}printf("\n");
}mysql_free_result(result);// 补充了解
typedef struct MYSQL_RES {uint64_t row_count;MYSQL_FIELD *fields;struct MYSQL_DATA *data;MYSQL_ROWS *data_cursor;unsigned long *lengths; /* column lengths of current row */MYSQL *handle;          /* for unbuffered reads */const struct MYSQL_METHODS *methods;MYSQL_ROW row;         /* If unbuffered read */MYSQL_ROW current_row; /* buffer to current row */struct MEM_ROOT *field_alloc;unsigned int field_count, current_field;bool eof; /* Used by mysql_fetch_row *//* mysql_stmt_close() had to cancel this result */bool unbuffered_fetch_cancelled;enum enum_resultset_metadata metadata;void *extension;
} MYSQL_RES;

这个例子执行一个简单的 SELECT 查询,然后使用 mysql_store_result 获取查询结果,并使用 mysql_fetch_row 逐行读取结果集中的数据。

4. 插入、更新和删除:

你可以使用 mysql_query 函数执行插入、更新和删除等修改数据库的操作。以下是一个插入数据的示例:

if (mysql_query(conn, "INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')")) {fprintf(stderr, "INSERT query failed: %s\n", mysql_error(conn));mysql_close(conn);exit(1);
}

5. 清理结果集:

//清理结果集:mysql_free_result()当你处理完查询结果后,需要调用这个函数来清理结果集。
mysql_free_result(result);
mysql_close(conn);

6.关闭连接

在程序结束时,确保关闭与 MySQL 服务器的连接并释放资源:

mysql_close(conn);

这些是 MySQL C API 的基本用法示例。请注意,为了简洁起见,没有进行错误处理的详细检查。在实际应用中,应该更加详细地处理错误以确保程序的稳定性。

API封装

以下为个人在使用过程中,对API的进一步封装

class DataBase {public:~DataBase() {Close();        // 析构函数自动关闭数据库}// 初始化,可以指定连接的 用户名,密码,数据存储库,host,portvoid Init(string name, string pwd, string database, string host = "localhost", int port = 3306) {mysql_init(&mysql_);// 连接数据库if (mysql_real_connect(&mysql_, host.c_str(), name.c_str(), pwd.c_str(), database.c_str(), port, NULL, 0) == NULL) {cout << mysql_error(&mysql_) << endl;cout << "connect error!" << endl;exit(-1);}// 设置字符集编码,包含了character_set_connection为utf8mb4,因为库以及表采用的是utf8mb4字符集if (!mysql_set_character_set(&mysql_, "utf8mb4")){printf("New client character set: %s\n", mysql_character_set_name(&mysql_));}// 设置character_set_client 客户端字符集为GBK,因为命令行窗口是GBK编码,否则mysql 1366 error// 设置character_set_results 查询结果集为GBK,因为命令行窗口是GBK编码,要对应起来,否乱码if (!Query("set character_set_client = gbk") || !Query("set character_set_results = gbk")) {cout << "set character_set_client or character_set_results gbk error:" << Error() << endl;}}// 执行语句bool Query(const string& query) {// 成功0,失败非0return !mysql_query(&mysql_, query.c_str());}// 释放结果集void FreeResult() {mysql_free_result(res_);}// 返回记录行数int Rows() {return mysql_num_rows(res_);}// 返回字段数量int Cols() {return mysql_num_fields(res_);}// 关闭数据库void Close() {mysql_close(&mysql_);}// 获取查询结果集MYSQL_RES* GetResult() {return res_ = mysql_store_result(&mysql_);}// 获取表字段MYSQL_FIELD* GetFields() {return mysql_fetch_fields(res_);}const char* Error() {return mysql_error(&mysql_);}// 获取一行记录MYSQL_ROW FetchRow() {return row_ = mysql_fetch_row(res_);}// 不区分大小写进行比较字符串,主要用于字段名比较bool InsensistiveStringCompare(const string& str1, const string& str2) {string str1Cpy(str1);string str2Cpy(str2);transform(str1Cpy.begin(), str1Cpy.end(), str1Cpy.begin(), ::tolower);transform(str2Cpy.begin(), str2Cpy.end(), str2Cpy.begin(), ::tolower);return (str1Cpy == str2Cpy);}// 输出结果集,便于调试void Show(const string& query) {if (!Query(query)) {cout << "show test error:" << Error() << endl;exit(-1);}MYSQL_RES* res = GetResult();if (!res) {cout << "GetResult error:" << Error() << endl;exit(-1);}int n = Rows(), m = Cols();cout << "共" << n << "条记录," << m << "个字段" << endl;MYSQL_ROW row;string field;vector<vector<string>> records(n + 1, vector<string>(m));vector<int> max_len(m);     // 记录每列数据的最大长度,便于格式化输出 int len = 0;MYSQL_FIELD* fields = GetFields();for (int i = 0; i < m; ++i) {records[0][i] = fields[i].name;         // 获取字段名max_len[i] = (int)max(fields[i].name_length, fields[i].max_length);     // 获取字段记录最大长度以及字段长度,记录最大值}for (int i = 1; i <= n; ++i) {row = FetchRow();for (int j = 0; j < m; ++j) {if (row[j]) field = row[j];else field = "NULL";records[i][j] = field;len = max(len, sizeof field);}}for (int i = 0; i <= n; ++i) {for (int j = 0; j < m; ++j) {cout << setiosflags(ios::left) << setw(max_len[j] + 2) << records[i][j] << ' ';}cout << endl;}}
private:MYSQL mysql_;           // 数据库句柄MYSQL_RES* res_;        // 查询结果集合MYSQL_ROW row_;         // 记录结构体};

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

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

相关文章

【前端设计】文字聚光灯

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 案例 文字聚光灯效果可以用于网站标题 html <!DOCTYPE html> <html lang"en&quo…

Android-JVM基础

GC机制 垃圾回收需要完成两件事&#xff1a;找到垃圾&#xff0c;回收垃圾。 找到垃圾一般的话有两种方法&#xff1a; 1、引用计数法&#xff1a; 当一个对象被引用时&#xff0c;它的引用计数器会加一&#xff0c;垃圾回收时会清理掉引用计数为0的对象。但这种方法有一个问题…

书生·浦语第二次作业

我最近在参加书生浦语大模型实战营&#xff0c;这是第二次作业打卡&#xff01; 如果你也想两周玩转大模型微调&#xff0c;部署与测评全链路。报名链接&#xff1a;invite 书生浦语大模型实战营报名 邀请码可以填026014 1. 基础作业&#xff08;一&#xff09;&#xff1a;…

什么是检索增强生成 (RAG)

什么是 RAG RAG&#xff0c;即检索增强生成&#xff0c;是一种将预训练的大型语言模型的功能与外部数据源相结合的技术。这种方法将 GPT-3 或 GPT-4 等 LLM 的生成能力与专用数据搜索机制的精确性相结合&#xff0c;从而形成一个可以提供细微响应的系统。 本文更详细地探讨了…

QTDAY1

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> #include <QLabel> #include <QMovie> #include <QLineEdit> #include <QPushButton> class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *p…

Docker Compose 基础知识(三)

Docker Compose 基础知识 什么是 Docker Compose ? Docker Compose 是 Docker 官方提供的一个工具&#xff0c;用于定义和管理多个 Docker 容器的应用程序。它基于 YAML 文件格式&#xff0c;允许你通过 一个定义文件来描述和配置整个应用程序的组件&#xff0c;包括容器、网…

jffs2文件系统制作

#!/bin/bash rm -rf rootfs.jffs2 chmod 755 ./rootfs -R chown root:root ./rootfs -R sudo mkfs.jffs2 -r ./rootfs -e $((64*1024)) -o rootfs.jffs2

探寻智能酒精壁炉在人类文化传承和精神需求中的重要意义

真火壁炉在人类文明中扮演着至关重要的角色&#xff0c;它不仅是温暖与照明的来源&#xff0c;更承载着人类的情感、记忆和文化传承。从古至今&#xff0c;真火壁炉一直都是家庭和社区聚集的焦点&#xff0c;象征着温暖、交流与家庭团聚。并且随着科技的进步&#xff0c;能使用…

k8s中pod的亲和性与反亲和性

一、节点选择 nodeSelector 提供了一个非常简单的方式&#xff0c;将 Pod 限定到包含特定标签的节点上。亲和性与反亲和性&#xff08;affinity / anti-affinity&#xff09;特性则极大地扩展了限定的表达方式。主要的增强点在于&#xff1a; 表达方式更加有效&#xff08;不仅…

SkyWalking介绍和Docker环境下部署

一、Skywalking概述 1、Skywalking介绍 Skywalking是分布式系统的应用程序性能监视工具&#xff0c;专为微服务&#xff0c;云原生架构和基于容器&#xff08;Docker&#xff0c;K8S,Mesos&#xff09;架构而设计&#xff0c;它是一款优秀的APM&#xff08;Application Perfo…

Halcon灰度的平均值和偏差intensity

Halcon灰度的平均值和偏差 intensity 算子用于计算单张图像上多个区域的灰度值的平均值和偏差。该算子的原型如下&#xff1a; intensity (Regions, Image ::: Mean, Deviation )其各参数的含义如下。 参数1&#xff1a;Regions&#xff08;输入参数&#xff09;&#xff0c;…

harmonyOS 时间选择组件(TimePicker)

本文 我们来说 TimePicker 时间组件 首先 我们搭一个最基本的组件骨架 Entry Component struct Index {build() {Row() {Column() {}.width(100%)}.height(100%)} }然后 在 Column 组件内 放一个 TimePicker进去 这里 我们就可以看到 一个时间的选择器了 DatePicker 捕获当前…

孪生神经网络MATLAB实战[含源码]

​一、算法原理 孪生神经网络&#xff08; Siamese neural network&#xff09;是一种深度学习网络&#xff0c;它使用两个或多个具有相同架构、共享相同参数和权重的相同子网。孪生网络通常用于寻找两个可比较事物之间的关系的任务。孪生网络的一些常见应用包括面部识别、签名…

node.js+mysql旅游景点分享网站-计算机毕业设计源码03796

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。旅游景点分享网站设计&#xff0c;主要的模块包括查看后台首页、轮播图&#xff08;轮播图管理&#xff09;、网站公告管理&#xff08;网站公告…

AQS 抽象队列同步器

AQS AQS &#xff08;抽象队列同步器&#xff09;&#xff1a; AbstractQueuedSynchronizer 是什么 来自jdk1.5&#xff0c;是用来实现锁或者其他同步器组件的公共基础部分的抽象实现&#xff0c;是重量级基础框架以及JUC的基石&#xff0c;主要用于解决锁分配给谁的问题整体…

Linux第17步_安装SSH服务

secure shell protocol简称SSH。 目的&#xff1a;在进行数据传输之前&#xff0c;SSH先对联级数据包通过加密技术进行加密处理&#xff0c;然后再进行数据传输&#xff0c;确保数据传输安全。 1、在安装前&#xff0c;要检查虚拟机可以上网&#xff0c;否则可能会导致安装失…

电商带货品牌直播间SOP运营执行步骤

【干货资料持续更新&#xff0c;以防走丢】 电商带货品牌直播间SOP运营执行步骤 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 直播运营模板合集&#xff08;完整资料包含以下内容&#xff09; 目录 直播业务商业框架.png直播工作流程SOP梳理.xlsx 2023年抖…

Protobuf 属性数据丢失问题

xxxx.proto文件 message xxx{string name 1double dsp 2;// 数据 } 这里有一个坑&#xff0c;如果给的这个dsp0 (通常会给默认值0) ,通过protobuf前端解析时&#xff0c;这个属性是会丢失的。 数据只会接受到name属性

HubSpot的内容管理系统(CMS)好用吗?

HubSpot的内容管理系统&#xff08;CMS&#xff09;通常被认为是功能强大且用户友好的工具&#xff0c;尤其适用于数字营销和在线业务。以下是一些HubSpot CMS的优势和功能&#xff1a; 用户友好的编辑界面&#xff1a; HubSpot CMS提供直观的编辑界面&#xff0c;具有拖放式编…

数字藏品如何赋能线下实体?以 BOOMSHAKE 潮流夜店为例

此篇为报告内容精华版&#xff0c;更多详细精彩内容请点击 完整版 在数字化浪潮的推动下&#xff0c;品牌和企业正在迎来一场前所未有的变革。传统市场营销策略逐渐让位于新兴技术&#xff0c;特别是非同质化代币&#xff08;NFT&#xff09;的应用。这些技术不仅改变了品牌资…