16 C语言连接

news2024/12/24 19:30:05

使用c语言连接mysql,需要使用mysql官网提供的库,可以在官网下载

准备工作:

保证mysql服务有效
官网下载合适的mysql connect库

也可以直接安装mysql服务

yum install -y mysql-devel

Connector/C使用

库格式如下:

[hb@MiWiFi-R1CL-srv lib]$ tree .
 .
 ├── include
 │   
├── big_endian.h  
├── byte_order_generic.h
 ├── byte_order_generic_x86.h
 ├── decimal.h
 ├── errmsg.h
 ├── keycache.h
 ├── little_endian.h
 ├── m_ctype.h
 ├── m_string.h
 ├── my_alloc.h
 ├── my_byteorder.h
 ├── my_compiler.h
 ├── my_config.h
 ├── my_dbug.h
 ├── my_dir.h
 ├── my_getopt.h
 ├── my_global.h
 ├── my_list.h
 ├── my_pthread.h
 ├── mysql  
├── client_authentication.h
 ├── client_plugin.h
 ├── client_plugin.h.pp
 ├── get_password.h
 ├── plugin_auth_common.h
 ├── plugin_trace.h
 ├── psi 
├── mysql_file.h
 ├── mysql_idle.h
 ├── mysql_mdl.h
 ├── mysql_memory.h
 ├── mysql_ps.h
 ├── mysql_socket.h
 ├── mysql_sp.h
├── mysql_stage.h  
├── mysql_statement.h
 ├── mysql_table.h
 ├── mysql_thread.h
 ├── mysql_transaction.h
 ├── psi_base.h
 ├── psi.h
 └── psi_memory.h
 ├── service_my_snprintf.h
 └── service_mysql_alloc.h
 ├── mysql_com.h
 ├── mysql_com_server.h
 ├── mysqld_ername.h
 ├── mysqld_error.h
 ├── mysql_embed.h
 ├── mysql.h
 ├── mysql_time.h
 ├── mysql_version.h
 ├── my_sys.h
 ├── my_xml.h
 ├── sql_common.h
 ├── sql_state.h
 ├── sslopt-case.h
 ├── sslopt-longopts.h
 ├── sslopt-vars.h
 └── typelib.h
 └── lib
 ├── libmysqlclient.a
 ├── libmysqlclient_r.a -> libmysqlclient.a
 ├── libmysqlclient_r.so -> libmysqlclient.so
 ├── libmysqlclient_r.so.18 -> libmysqlclient.so.18
 ├── libmysqlclient_r.so.18.3.0 -> libmysqlclient.so.18.3.0
 ├── libmysqlclient.so -> libmysqlclient.so.18
 ├── libmysqlclient.so.18 -> libmysqlclient.so.18.3.0
 └── libmysqlclient.so.18.3.0

其中inlcude包含所有的方法声明,lib包含所有的方法实现(打包成库)
尝试连接mysql client
通过mysql_get_client_info()函数,验证是否成功

#include <stdio.h>
#include <mysql.h>  
int main()
 {
 printf("mysql client Version: %s\n", mysql_get_client_info());
 return 0;
 }
 [@MiWiFi-R1CL-srv lib]$ gcc -o test test.c -I./include -L./lib -lmysqlclient
 [@MiWiFi-R1CL-srv lib]$ ls
 include  lib  test  test.c
 [@MiWiFi-R1CL-srv lib]$ ./test
 ./test: error while loading shared libraries: libmysqlclient.so.18: cannot open 
shared object file: No such file or directory
[@MiWiFi-R1CL-srv lib]$ export LD_LIBRARY_PATH=./lib #动态库查找路径,讲解ldd命令
[@MiWiFi-R1CL-srv lib]$ ./test
 mysql client Version: 6.1.6

至此引入库的工作已经做完,接下来是熟悉接口

接口介绍

初始化mysql_init()

要使用库,先进行初始化

MSYQL *mysql_init(MYSQL* mysql);

如:MYSQL* mfp = mysql_init(NULL)

连接数据库mysql_real_connect

初始化完毕后,必须先连接数据库,在进行后续操作(mysql网络部分是基于TCP/IP的)

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 clientflag);
 //建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
 mysql_set_character_set(myfd, "utf8");

第一个参数MYSQL是C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。也包含了一个叫st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功后的各种数据操作中被调用

下发mysql命令mysql_query

int mysql_query(MYSQL* mysql, cost char* q);

第一个参数已经介绍过了,第二个参数为要执行的sql语句,如“select * from table”
获取执行结果mysql_store_result

sql执行完毕以后,如果是查询语句,还要读取数据,如果update,insert等语句,就看下操作成功与否。看看如何获取查询结果:如果mysql_query返回成功,就通过mysql_store_result函数读取结果,原型如下:

MYSQL_RES* mysql_store_result(MYSQL* mysql);

该函数会调用MYSQL变量中的st_mysql_methods中的read_rows函数指针获取查询的结果。同时该函数会返回MYSQL_RES这样一个变量,该变量用于保存查询的结果。同时该函数malloc了一片内存空间存储查询的数据,一定要记住free(result),不然肯定会造成内存泄露的。执行完mysql_store_result后,数据都在MYSQL_RES变量中了,下面的api基本就是读取MYSQL_RES的数据

在这里插入图片描述
这个结构是一个二维数组,每一行对应数据表的一条记录,一行每个数据对应每个字段

  • 获取结果行数mysql_num_rows

my_ulonglong mysql_num_rows(MYSQL_RES* res);

  • 获取结果列数mysql_num_fields

unsigned int mysql_num_fields(MYSQL_RES* res);

  • 获取列名mysql_fetch_fields

MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES* res);

如:

int fields = mysql_num_fields(res);
 MYSQL_FIELD *field = mysql_fetch_fields(res);
 int i = 0;
 for(; i < fields; i++){
 cout<<field[i].name<<" ";
 }
 cout<<endl;
  • 获取结果内容mysql_fetch_row

MYSQL_ROW mysql_fetch_row(MYSQL_RES* result);

它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char**,当成一个二维数组用

i = 0;
 MYSQL_ROW line;
 for(; i < nums; i++){
 line = mysql_fetch_row(res);
 int j = 0;
 for(; j < fields; j++){
 cout<<line[j]<<" ";
 }
 cout<<endl;
 }
  • 关闭mysql连接mysql_close

另外,mysql C api还支持事务等常用操作

my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
my_bool STDCALL mysql_commit(MYSQL * mysql);
my_bool STDCALL mysql_rollback(MYSQL * mysql);

test.cpp

#include <iostream>
#include <mysql/mysql.h>
#include <unistd.h>

using namespace std;
const char *host = "localhost";
const char *user = "connect";
const char *password = "1234";
const char *db = "con";
unsigned int port = 3306;

int main()
{
    //printf("mysql client version: %s\n", mysql_get_client_info());
    MYSQL *my = mysql_init(nullptr);
    if (my == nullptr)
    {
        cerr << "mysql init error" << endl;
    }

    if (mysql_real_connect(my, host, user, password, db, port, nullptr, 0) == nullptr)
    {
        cerr << "mysql connect error" << endl;
    }

    mysql_set_character_set(my, "utf8");
    // const char *sql = "update person set name='zhangqiang' where id = 2";
    // const char *sql = "insert into person values(5, '李三', 18);";
    // const char *sql = "delete from person where id = 4";
    const char *sql = "select * from person";
    int n = mysql_query(my, sql);
    if (n == 0)
    {
        cout << "success" << endl;
    }
    else
    {
        cout << "failed" << endl;
        return 3;
    }

    MYSQL_RES *res = mysql_store_result(my);
    if (res == nullptr)
    {
        cerr << "result get error" << endl;
        return 4;
    }

    my_ulonglong rows = mysql_num_rows(res);
    my_ulonglong fields = mysql_num_fields(res);
    cout << rows << "行" << fields << "列" << endl;

    // 属性
    MYSQL_FIELD *field = mysql_fetch_field(res);
    for (int i = 0; i < fields; i++)
    {
        cout << field[i].name << "\t\t";
    }

    cout << endl;
    // 获取结果内容
    for (int i = 0; i < rows; i++)
    {
        // 迭代器功能
        MYSQL_ROW row = mysql_fetch_row(res);
        for (int j = 0; j < fields; j++)
        {
            cout << row[j] << "\t\t";
        }
        cout << endl;
    }

    // sleep(10);
    cout << "connect success" << endl;
    mysql_free_result(res);
    mysql_close(my);
    return 0;
}

makefile

mytest: test.cpp
	g++ -o mytest test.cpp -std=c++11 -L/lib64/mysql -lmysqlclient
.PHONY: clean
clean:
	rm -f *.o mytest 


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

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

相关文章

无线麦克风推荐,无线麦克风十大名牌,领夹麦克风十大品牌推荐

在音频创作的专业舞台上&#xff0c;无线领夹麦克风不仅是声音捕捉的利器&#xff0c;更是创作者表达情感的桥梁。然而&#xff0c;市场上琳琅满目的产品让人眼花缭乱&#xff0c;不少劣质麦克风不仅收音效果大打折扣&#xff0c;还常因信号不稳、噪音干扰而破坏了作品的纯净度…

使用NI CANopen与多个节点进行通信

要使用N CANopen同时与多个节点进行通信&#xff0c;可以利用CANopen Library Toolkit提供的不同VI。以下是详细的步骤说明&#xff1a; 了解VI的功能&#xff1a; NMT Write.vi&#xff1a; 该VI用于向特定节点或所有节点发送网络管理&#xff08;NMT&#xff09;命令。使用No…

Linux之多线程概念

目录 线程概念 线程共享的资源 线程独有的资源 线程优点 线程缺点 在之前&#xff0c;我们已经学习了进程相关的知识点&#xff0c;如进程的基本概念和基本操作&#xff0c;本期我们将开始进行线程的学习&#xff0c;探索线程和进程的关系。 线程概念 在学习线程之前…

镭速助力构筑ICT安全高效的大文件传输

在数字化浪潮的推动下&#xff0c;信息通信技术&#xff08;ICT&#xff09;行业正以惊人的速度发展&#xff0c;随之而来的是跨国、跨区域文件传输需求的激增。然而&#xff0c;传统的大文件传输方法已难以满足当前ICT行业的需求&#xff0c;面临着诸多挑战&#xff0c;如跨国…

多用户B2B2C商城源码+短视频直播+APP+小程序+H5

店铺管理 店铺列表&#xff0c;新店铺审核&#xff0c;地址管理&#xff0c;服务管理&#xff0c;运费模版&#xff0c;品牌管理 订单监管 视频订单&#xff0c;拼团订单&#xff0c;评论管理&#xff0c;退款管理 装修商城 模版管理&#xff0c;页面管理&#xff0c;全局…

太速科技-1路万兆光纤SFP+和1路千兆网络 FMC子卡模块

1路万兆光纤SFP和1路千兆网络 FMC子卡模块 一、概述 该板卡是基于kc705和ml605的fmc 10g万兆光纤扩展板设计&#xff0c;提供了1路万兆光纤SFP和1路千兆网络接口。可搭配我公司开发的FPGA载卡使用。载卡可参考&#xff1a;ID204 SFP&#xff08;10 Gigabit Small…

涨幅超过了90%,心动网络股价成V字后,TapTap找到流量源了吗?

心动公司发布了截至2024年6月30日止六个月的中期业绩。 在2024年上半年&#xff08;24H1&#xff09;&#xff0c;公司实现总营收22.21亿元&#xff0c;较去年同期增长了26.7%。归属于母公司的净利润达到2.05亿元&#xff0c;同比激增127.4%。经调整后&#xff0c;归属于母公司…

Linux下使用crontab配置定时任务

文章目录 Linux使用crontab安装crontab启动crontab查看定时任务创建定时任务配置案例配置语法位置含义符号含义 注意 取消定时任务 Linux使用crontab crontab为Linux下的计划任务程序&#xff0c;对应的服务为crond。crond是一个守护进程&#xff0c;每分钟会定期检查是否有要…

OZON秋季爆款新品推荐,OZON秋季爆款

Top1 吸顶灯 Светильник влагозащищенный 15W IP65 6500К (155х37) круг светодиодный настенно-потолочный герметичный для использования в сухих а так-же вла…

自闭症儿童的语言障碍:理解、接纳与干预

自闭症&#xff0c;这个在现代社会中逐渐受到关注的神经发育障碍&#xff0c;给许多家庭带来了挑战与希望并存的旅程。其中&#xff0c;自闭症儿童的语言障碍是尤为显著且复杂的问题之一。 自闭症儿童的语言障碍表现为多种形式&#xff0c;包括语言发育迟缓、语言形式或内容异常…

如何修复软件中的BUG

笔者上一篇博文《如何开发出一款优秀的软件》主要讲了如何开发一款优秀的软件及相应的必要条件。但对一个已上线&#xff0c;已经成型的产品&#xff0c;该如何解决存在的bug呢&#xff1f;这是本文要阐述的内容。 在这里&#xff0c;首先说一下bug的种类及bug严重程度分类&…

echarts图表标题,层级,view表格,机型适配

1.主标题和副标题在同一行上 在副标题当中设置itemGap:0 title: [{text: ,left: left,textStyle: {fontSize: adjustSize(0.7),fontWeight: 400,color:#333,}},{subtext: ,left: right,itemGap: 0, subtextStyle: { //设置字体样fontSize: adjustSize(0.7),fontFamily: sans-s…

Linux查看jar包错误日志及持久化运行jar包

一、查看jar包运行信息命令&#xff1a;ps -ef | grep java 如图&#xff0c;给出了所部署jar包的环境变量&#xff0c;服务名称&#xff0c;服务端口信息。 这样便能得到部署的jar包是否在服务器成功运行及基本信息。 二、查看日志 启动信息无误&#xff0c;查看日志是否有报错…

机器人5GCPE模块参数的获取与上报设计

目录 1. 5GCPE模块参数功能的获取 2. 5GCPE模块参数功能的上报 3. 5G与WIFICPE运行效果 1. 5GCPE模块参数功能的获取 根据5G皮带机器人新需求&#xff0c;需要增加5GCPE信息的获取与上报参数的需求&#xff0c;以供上位机进行信号强度等信息的展示&#xff0c;所获取的ip地址…

十一、对象池

转载对象池链接&#xff1a;http://t.csdnimg.cn/YnwKL 一、理念 创建一个对象池代码&#xff08;通用版代码&#xff09; 注&#xff1a;对象池是2021之后才有的功能 创建对象池代码&#xff1b;引入命名空间&#xff1b; 公开变量&#xff0c;传入生成的哪个模型 创建对…

11 C语言先序方式创建二叉树

这个代码是使用占位符的方式创建二叉树 #include "stdio.h" #include "stdlib.h"typedef struct node {char data;struct node *lchild;struct node *rchild; } Node;Node *create_node(char value) {Node *node (Node *) malloc(sizeof(Node));if (node…

weblogic漏洞——CVE-2020-14882

一、基本信息 靶机&#xff1a;IP&#xff1a;192.168.100.40 二、攻击过程 进入 vulhub 靶场相关目录&#xff0c;并启动环境 cd master/weblogic/CVE-2020-14882 docker-compose up -d 绕过登录验证 http://192.168.100.40:7001/console/css/%252e%252e%252fconsole.por…

软件测试学习笔记丨Linux-Bash编程语法

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32091 一、Bash编程基础 1.1 变量 1.1.1 语法 Variable_namevalue 1.1.2 变量定义的规则 变量名区分大小写&#xff0c;a和A为两个不同的变量&#xff1b;变量名可以使用大小写字母混编的…

陷抄袭风波 《黑神话:悟空》该如何应对

都说人红是非多&#xff0c;国产首部3A游戏《黑神话&#xff1a;悟空》在爆火的同时&#xff0c;一些问题也随之出现。一方面《黑神话&#xff1a;悟空》陷入抄袭风波&#xff1f;另一方面该游戏也被很多黑灰产盯上了。 8月23日&#xff0c;“塞上李云中”发布微博&#xff0c;…

【WRF安装编译问题解决】Linux中gcc和gfortran降级方法

Linux中gcc和gfortran降级方法 准备&#xff1a;gcc和gfortran版本查找1 查看gcc和gfortran安装版本2 gcc版本降级2.1 gcc版本降级至9.5.0-通过下载源码编译安装2.2 gcc版本降级至9.1.0-通过下载源码编译安装 3 gfortran版本降级参考 在安装编译WRF环境时&#xff0c;无法成功编…