ubuntu18.04下mysql数据库C语言API操作总结

news2024/11/18 7:43:39

     通过C/C++去操作数据库需要调用mysql客户端api,常用api和调用举例见后面。

目录

一.常用api

1.环境初始化

2.连接 mysql 的服务器

3.增删改查操作

4.事务处理

5.处理查询数据集合

6.释放资源,关闭连接

7.字符集相关

8.获取错误信息

二.api调用举例


一.常用api

1.环境初始化

/**
初始化得到一个MYSQL对象,参数mysql一般为空
*/
MYSQL *mysql_init(MYSQL *mysql) ;

2.连接 mysql 的服务器

/**
用初始化的MYSQL指针去连接服务器,得到一个连接的MYSQL独享
返回值: 
    成功: 返回MYSQL*连接句柄, 返回值与第1个参数的值相同
    失败,返回NULL
*/ 
MYSQL *mysql_real_connect(
    MYSQL *mysql,           // mysql_init() 函数的返回值
    const char *host,       // mysql服务器的主机地址, 写IP地址即可,localhost, null -> 代表本地连接
    const char *user,       // mysql服务器的用户名, 默认: root 
    const char *passwd,     // mysql服务器用户对应的密码,
    const char *db,         // 使用的数据库的名字
    unsigned int port,      // mysql服务器监听的端口,如果为0,则使用默认端口3306, 否则使用指定的这个端口
    const char *unix_socket,// 本地套接字, 不使用指定为 NULL
    unsigned long client_flag); // 指定为0即可

3.增删改查操作

/**
执行增删改查的sql语句
参数:
    mysql: mysql_real_connect函数的返回值
    query: 要执行的sql语句,结尾不需要加;(分号)
返回值:
    成功:返回0,如果是查询, 则查询结果在mysql指针指向对象中
    失败:返回非0值,
*/
int mysql_query(MYSQL *mysql, const char *query);

4.事务处理


对数据库进行增加/删除/修改操作时,需要进行事务处理,执行完操作后要判断状态
操作成功:事务提交
操作失败:回滚数据

/**
接口默认会提交事务,自动提交事务不利于对数据的控制,可以修改手动提交事务
mode: 0:不自动提交事务 1:自动提交事务
返回值:
    成功:返回0
    失败:返回非0 
*/
my_bool mysql_autocommit(MYSQL *mysql, my_bool mode) 

// 事务提交
/**
提交事务
返回值: 
    成功:返回0
    失败:返回非0 
*/
my_bool mysql_commit(MYSQL *mysql);


/**
回滚数据
返回值: 
    成功:返回0
    失败:返回非0 
*/
my_bool mysql_rollback(MYSQL *mysql) 


5.处理查询数据集合


5.1得到结果集

/**
从mysql中得到结果集,结果集存放在MYSQL_RES类型的内存中
成功:得到结果集
失败:返回NULL
*/
MYSQL_RES *mysql_store_result(MYSQL *mysql);

5.2得到查询结果的列数

/**
得到查询结果的列数
返回值:代表列数
*/
unsigned int mysql_num_fields(MYSQL_RES *result)

5.3得到查询结果列信息

/**
获取查询结果集合的列名称
返回值:列信息结构体
*/
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result);
mysql.h中MYSQL_FIELD定义如下:
typedef struct st_mysql_field {
  char *name;                 /* Name of column */
  char *org_name;             /* Original column name, if an alias */
  char *table;                /* Table of column if column was a field */
  char *org_table;            /* Org table name, if table was an alias */
  char *db;                   /* Database for table */
  char *catalog;              /* Catalog for table */
  char *def;                  /* Default value (set by mysql_list_fields) */
  unsigned long length;       /* Width of column (create length) */
  unsigned long max_length;   /* Max width for selected set */
  unsigned int name_length;
  unsigned int org_name_length;
  unsigned int table_length;
  unsigned int org_table_length;
  unsigned int db_length;
  unsigned int catalog_length;
  unsigned int def_length;
  unsigned int flags;         /* Div flags */
  unsigned int decimals;      /* Number of decimals in field */
  unsigned int charsetnr;     /* Character set */
  enum enum_field_types type; /* Type of field. See mysql_com.h for types */
  void *extension;
} MYSQL_FIELD;

/**
得到查询结果集合列数,方法一
*/
unsigned int mysql_num_fields(MYSQL_RES *res);

/**
得到查询结果集合列数,方法二
*/
unsigned int mysql_field_count(MYSQL *mysql);


5.4获取结果集合的下一行记录

/**
得到下一行记录
参数: 
     result: 结果集
返回值: 
    成功: 记录中每个字段的值
    失败: NULL, 读取完毕
*/
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
mysql.h中MYSQL_ROW定义如下,是一个二级指针,一级指针则为一行中每列具体的值
typedef char **MYSQL_ROW;               /* return data as array of strings */

/**
得到结果集合总行数
*/
my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);
mysql.h中my_ulonglong定义如下
#ifndef MY_GLOBAL_INCLUDED
#if defined (_WIN32)
typedef unsigned __int64 my_ulonglong;
#else
typedef unsigned long long my_ulonglong;
#endif
#endif


6.释放资源,关闭连接

/**
释放结果集对应内存资源
*/
void mysql_free_result(MYSQL_RES *result);

/**
关闭数据库连接
*/
void mysql_close(MYSQL *mysql);

7.字符集相关

/**
得到api使用的编码方式
*/
const char *mysql_character_set_name(MYSQL *mysql) 

/**
设置api编码方式
csname:编码方式,要支持中文,参数可选择utf8
*/
int mysql_set_character_set(MYSQL *mysql, char *csname);

8.获取错误信息

/**
得到错误编号
*/
unsigned int mysql_errno(MYSQL *mysql);

/**
得到错误描述
*/
const char *mysql_error(MYSQL *mysql);

二.api调用举例

例如创建数据库和表分别如下:

CREATE DATABASE `TestDB` DEFAULT CHARACTER SET utf8;
 CREATE TABLE `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `address` varchar(45) NOT NULL,
  `age` int(11) NOT NULL,
  `position` varchar(45) NOT NULL,
  `remark` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;

代码如下:

connmysql.cpp

#include <stdio.h>
#include <mysql/mysql.h>

int main(int argc, char* argv[])
{
    //1.初始化环境
    MYSQL* mysql = mysql_init(NULL);
    if(mysql == NULL)
    {
        printf("mysql_init() error\n");
        return -1;
    }

    //2.连接数据库服务器
    mysql = mysql_real_connect(mysql, "localhost", "root", "mysql", 
                               "TestDB", 0, NULL, 0);
    if(mysql == NULL)
    {
        printf("mysql_real_connect() error\n");
        return -1;
    }

    //编码相关
    //查看编码
    printf("mysql api charset : %s\n", mysql_character_set_name(mysql));
    //设置编码为utf8
    mysql_set_character_set(mysql, "utf8");
    printf("after alter, mysql api charset : %s\n", mysql_character_set_name(mysql));

    //3.执行一个sql语句
    const char* sql = "select * from employee";
    int ret = mysql_query(mysql, sql);
    if(ret != 0)
    {
        printf("mysql_query() error : %s\n", mysql_error(mysql));
        return -1;
    }

    //4.取出结果集
    MYSQL_RES* res = mysql_store_result(mysql);
    if(res == NULL)
    {
        printf("mysql_store_result() error : %s\n", mysql_error(mysql));
        return -1;
    }

    //5.结果集中的列数
    // int num = mysql_num_fields(res);
    int num = mysql_field_count(mysql);

    //6.得到所有列的名字, 并且输出
    MYSQL_FIELD * fields = mysql_fetch_fields(res);
    for(int i=0; i<num; ++i)
    {
        printf("%-10s\t", fields[i].name);
    }
    printf("\n");

    //7.遍历结果集中所有的行
    MYSQL_ROW row;
    while( (row = mysql_fetch_row(res)) != NULL)
    {
        //将当前行中的每一列信息读出
        for(int i=0; i<num; ++i)
        {
            printf("%-10s\t", row[i]);
        }
        printf("\n");
    }

    //8.释放资源 - 结果集
    mysql_free_result(res);

    //9.表中插入数据
    //设置事务为手动提交
    mysql_autocommit(mysql, 0); 

    int ret1 = mysql_query(mysql, "insert into employee(name, address, age, position, remark) values('liudehua', 'xianggang', 18, 'one', '天王 1')");
    int ret2 = mysql_query(mysql, "insert into employee(name, address, age, position, remark) values('guofucheng', 'beijing', 19, 'two', '天王 2')");
    int ret3 = mysql_query(mysql, "insert into employee(name, address, age, position, remark) values('liming', 'chongqing', 20, 'three', '天王 3')");
    int ret4 = mysql_query(mysql, "insert into employee(name, address, age, position, remark) values('zhangxueyou', 'tianjin', 21, 'four', '天王 4')");
    printf("ret1 = %d, ret2 = %d, ret3 = %d, ret4 = %d\n", ret1, ret2, ret3, ret4);

    if(ret1==0 && ret2==0 && ret3==0 && 0 == ret4)
    {
        //提交事务
        mysql_commit(mysql);
    }
    else
    {
        printf("error %s\n", mysql_error(mysql));
        mysql_rollback(mysql);
    }

    //关闭数据库
    mysql_close(mysql);
    
  return 0;
}

编译运行:

g++ connmysql.cpp -L/user/lib/mysql -lmysqlclient 

./a.out 

 数据库已经存在数据:

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

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

相关文章

Linux杂谈之sudo

一 sudo配置文件/etc/sudoers介绍 ① 什么是sudo 1) sudo 的英文全称是 super user do&#xff0c;即以超级用户root 用户的方式执行命令2) /etc/sudoers 是一个文本文件,只有root用户有该命令的执行权限 1) 允许普通用户以特权用户的权限去执行某些特权命令,访问和使用本…

优秀国土空间规划设计网络评选投票投票怎么进行小程序免费使用

如果通过一个小程序免费制作一个微信投票活动呢&#xff1f;文章详细讲解如何利用一款免费好用的微信小程序“活动星投票”小程序来制作投票活动&#xff0c;无需注册即可免费制作&#xff0c;非常的方便快捷&#xff0c;可以实现视频投票、分组投票、隐藏选手票数、导出投票数…

【Linux】进程概念(下)

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;进程状态&…

手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)

导 读 本文将手把手教你用Python和OpenCV搭建一个半自动标注工具&#xff08;包含详细步骤 源码&#xff09;。 背景介绍 样本标注是深度学习项目中最关键的部分&#xff0c;甚至在模型学习效果上起决定性作用。但是&#xff0c;标注工作往往非常繁琐且耗时。一种解决方案是…

【苹果家庭群发推】创作AppleScript脚本来控制MacOS附有的iMessage客户端停止考据,近似于组iMessage

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

ENVI_IDL:如何对文件名的日期进行格式化输出?

目录 00 前言 01 第一步&#xff0c;使用file_basename()函数路径中的获取文件名 02 第二步&#xff0c;使用strmid()函数获取文件名的日期 03 第三步&#xff0c;将获取的日期进行类型转换 04 第四步&#xff0c;将日期进行整理 05 第五步&#xff0c;进行格式化输出 …

BiSeNetv2:语义分割经典方法BiSeNet的升级版本

分享IJCV2021上发表的一篇文章BiSeNetv2&#xff0c;这是BiSeNet的升级版本。开源代码地址&#xff1a;https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv2 1.动机 语义分割是指为每个像素分配一个标签&#xff0c;它广泛用于场景理解、自动驾驶、人…

uniapp中app真机模拟以及小程序编译后css样式异常失效问题原因及解决方案

前言 最近写使用uniapp写app&#xff0c;开发的时候写样式都是使用浏览器h5进行调试一切正常&#xff0c;但是最后进行手机真机调试的时候css样式出现了异常&#xff0c;本文归纳常见的问题 比如在h5页面显示正常&#xff1a; 但是在真机调试app的实现则显示&#xff1a; H5正…

【PyTorch深度学习实践】02_梯度下降

文章目录梯度下降1.梯度下降算法实现代码2.随机梯度下降实现代码3.小批量随机梯度下降梯度下降 1.梯度下降算法 之前可以使用穷举的方法逐个测试找使损失函数最小的点&#xff0c;但当数据过多时&#xff0c;维度过高&#xff0c;会使穷举变得非常困难&#xff0c;因此需要优…

K8s 数据管理

目录前言一、Volume1.1 emptyDir1.1.1 基本概念1.1.2 应用案例1.2 hostPath1.2.1 基本概念1.2.2 应用案例1.3 外部 Storage Provider二、Persistent Volume2.1 基本概念2.1.1 PersistentVolume2.1.2 PersistentVolumeClaim2.2 NFS PersistentVolume前言 与 Docker 类似&#x…

QML教程(一)基础语法

目录 一、导入 二、对象声明 三、对象属性 1.声明对象属性 2.信号属性 3.方法属性 4.附加属性略 5.枚举属性 6.对象属性赋值 四、自定义对象 一、导入 模块导入 语法&#xff1a; import <ModuleIdentifier> [<Version.Number>] [as <Qualifier>…

面向对象设计原则概述

面向对象设计原则概述 软件的可维护性和可复用性 软件工程和建模大师Peter coad认为&#xff0c;一个好的系统设计与应该具备如下三个性质 可扩展性 灵活性 可插入性 软件的可维护性和可复用性 软件的复用和重用拥有众多优点&#xff0c;如可以提高软件的开发效率&#xf…

Educational Codeforces Round 92 (Rated for Div. 2) B. Array Walk

翻译&#xff1a; 给定一个数组&#x1d44e;1&#xff0c;&#x1d44e;2&#xff0c;…&#xff0c;&#x1d44e;&#x1d45b;&#xff0c;由&#x1d45b;个正整数组成。 最初&#xff0c;您位于索引1&#xff0c;分数等于&#x1d44e;1。你可以执行两种动作: 向右移动…

CDN

CDN——Content Delivery Network&#xff0c;内容分发网络。 具体来说&#xff0c;CDN就是采用更多的缓存服务器&#xff08;CDN边缘节点&#xff09;&#xff0c;布放在用户访问相对集中的地区或网络中。当用户访问网站时&#xff0c;利用全局负载技术&#xff0c;将用户的访…

【CSP】邻域均值

邻域均值 邻域均值 题意比较好理解&#xff0c;就是算一些数字。如果采用暴力方法的话&#xff0c;就是用一个边长为 2∗r12*r12∗r1 的正方形框框住大矩阵&#xff0c;然后遍历这个框&#xff0c;求出其平均值&#xff0c;然后移动正方形框&#xff0c;直到大矩阵内所有像…

【免费开放源码】审批类小程序项目实战(预约审批端)

第一节&#xff1a;什么构成了微信小程序、创建一个自己的小程序 第二节&#xff1a;微信开发者工具使用教程 第三节&#xff1a;深入了解并掌握小程序核心组件 第四节&#xff1a;初始化云函数和数据库 第五节&#xff1a;云数据库的增删改查 第六节&#xff1a;项目大纲以及制…

6.5 特殊用途语言特性

文章目录默认实参使用默认实参调用函数默认实参声明默认实参初始值内联函数和constexpr函数内联函数constexpr 函数把内联函数和constexpr函数声明在头文件内调试帮助assert预处理宏NDEBUG预处理变量默认实参 某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同…

电子游戏销售之缺失值检测与处理

电子游戏销售之缺失值检测与处理 文章目录电子游戏销售之缺失值检测与处理0、写在前面1、数据缺失值预处理1.1 表的形状1.2 原始数据每个特征缺失和非缺失的数目1.3 每个特征缺失的率1.4 处理后各特征缺失值的数目1.5 删除缺失值后的数据展示2、替换法处理缺失值2.1 替换法2.2 …

1.Springboot配置细节

一、参考资料 13-SpringBoot配置-项目外部配置加载顺序_哔哩哔哩_bilibili 二、配置 2.1 配置文件 注意变量后面是:&#xff0c;而不是等号 2.2 读取配置文件 2.2.1 Value 比如配置文件application.properities中定义了一个name&#xff0c;其值为abc。 代码里面只需按照如…

一、软件安装与配置

一、PyTorch环境软件安装与配置 1.安装anaconda参考 anaconda老版本下载方法&#xff08;如何查看anaconda与python版本对应关系&#xff09;及安装教程_breadth_的博客-CSDN博客_anaconda旧版本下载 2.在anconda下安装和激活pytorch环境 此步并没有下载pytorch 3.下载pyto…