C语言连接并实现对MySQL的增删改查

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: C语言访问数据库并不如Java、Python那般容易。本文介绍C语言连接并实现对MySQL的增删改查的方法。

C语言访问数据库并不如Java、Python那般容易。本文为读者介绍C语言连接并实现对MySQL的增删改查的方法,已证实可行。

SQL脚本:

DROP DATABASE IF EXISTS `card`;
CREATE DATABASE `card`;

USE `card`;

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL COMMENT '用户ID',
  `name` varchar(255) NOT NULL COMMENT '用户姓名',
  `password` varchar(255) NOT NULL COMMENT '用户密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'tom', 'tom');
INSERT INTO `user` VALUES ('2', 'root', 'root');
INSERT INTO `user` VALUES ('3', 'bob', 'bob');

CMakeLists.txt的配置至关重要:

cmake_minimum_required(VERSION 3.21)
project(c_mysql_connection C)

set(CMAKE_C_STANDARD 99)

# 主要配置,写绝对路径
include_directories(D:\\MySQL\\include)
link_directories(D:\\MySQL\\lib)

add_executable(c_mysql_connection main.c)

# 加了环境变量PATH
target_link_libraries(c_mysql_connection libmysql)

查询MySQL的C语言代码:

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

// 声明 MySQL 的句柄
MYSQL mysql, *sock;

int main() {
    const char *host = "127.0.0.1";
    const char *user = "...";  // 自己填
    const char *passwd = "..."; // 自己填
    const char *db = "card";
    unsigned int port = 3306;
    const char *unix_socket = NULL;    // Windows是NULL
    unsigned long client_flag = 0;
    const char *query_users = "select * from `user`";
    MYSQL_RES *result;
    MYSQL_ROW row;
    // 初始化
    mysql_init(&mysql);
    // 连接 MySQL
    if ((sock = mysql_real_connect(&mysql, host, user, passwd, db,
                                   port, unix_socket, client_flag)) == NULL){
        printf("连接MySQL失败,原因是: \n");
        fprintf(stderr, " %s\n", mysql_error(&mysql));
        exit(1);
    } else {
        fprintf(stderr, "连接MySQL成功!\n");
    }
    // 执行 MySQL 查询
    if (mysql_query(&mysql, query_users) != 0) {
        fprintf(stderr, "查询失败!\n");
        exit(1);
    } else {
        if ((result = mysql_store_result(&mysql)) == NULL) {
            fprintf(stderr, "保存结果集失败!\n");
            exit(1);
        } else {
            // 读取结果集中的数据,返回的是下一行(因为保存结果集时,当前的游标在第一行之前)
            while ((row = mysql_fetch_row(result)) != NULL) {
                printf("用户ID:%s\t", row[0]);
                printf("用户姓名:%s\t\n", row[1]);
            }
        }
    }
    // 释放结果集
    mysql_free_result(result);
    // 断开连接
    mysql_close(sock);
    // 退出系统
    exit(EXIT_SUCCESS);
}

插入MySQL的C语言代码:

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

// 声明 MySQL 的句柄
MYSQL mysql, *sock;

int main() {
    const char *host = "127.0.0.1";
    const char *user = "...";  // 自己填
    const char *password = "...";  // 自己填
    const char *db_name = "card";
    unsigned int port = 3306;
    const char *unix_socket = NULL;    // Windows是NULL
    unsigned long client_flag = 0;
    const char *add_users = "insert into `user` values (4, 'candy', 'can_can_need')";
    MYSQL_RES *result;
    MYSQL_ROW row;
    // 初始化
    mysql_init(&mysql);
    // 连接MySQL
    if ((sock = mysql_real_connect(&mysql, host, user, password, db_name,
                                   port, unix_socket, client_flag)) == NULL){
        printf("连接MySQL失败,原因是: \n");
        fprintf(stderr, " %s\n", mysql_error(&mysql));
        exit(1);
    } else {
        fprintf(stderr, "连接MySQL成功!\n");
    }
    // 插入新的数据实例
    if (mysql_query(&mysql, add_users) != 0) {
        fprintf(stderr, "插入MySQL失败!\n");
        exit(1);
    } else {
        fprintf(stdout, "插入MySQL成功!\n");
    }
    // 释放结果集
    mysql_free_result(result);
    // 断开连接
    mysql_close(sock);
    // 退出系统
    exit(EXIT_SUCCESS);
}

注意!初始化的时候注意必须是:

MYSQL mysql;
mysql_init(&mysql);

文末,附上mysql.h常用函数和变量:

// 连接句柄
MYSQL *mysql;
 
// 初始化
MYSQL *mysql_init(MYSQL *mysql);
 
// 设置连接选项
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg);
 
// 打开连接
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);
 
// 执行SQL语句
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);
// 如果C风格SQL语句
int mysql_query(MYSQL *mysql, const char *query);
 
// SQL语句一般只能是一条语句,如果想在一个函数调用中执行多个SQL语句,需要以;隔开,并且设置在打开连接时设置属性CLIENT_MULTI_STATEMENTS
// 可以对已经打开的连接进行以下函数调用设置,其中mysql为MYSQL的指针
mysql_set_server_option(mysql,MYSQL_OPTION_MULTI_STATEMENTS_ON);
 
// 执行一个有返回结果的语句,只是初始化MYSQL_RES结构体,并不真正从服务器获取结果
MYSQL_RES *mysql_use_result(MYSQL *mysql);
// 执行一个有返回结果的语句,直接将全部数据读取到客户端
MYSQL_RES *mysql_store_result(MYSQL *mysql);

// 用MYSQL_RES结构体获得数据,返回的MYSQL_ROW类型实际为char**类型,通过下标操作可以取得每一列的值
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
 
// 获得结果集的列数
unsigned int mysql_field_count(MYSQL *mysql);
unsigned int mysql_num_fields(MYSQL_RES *result);
// 获得结果集的行数
my_ulonglong mysql_num_rows(MYSQL_RES *result);
 
// 使用完结果集后一定要记得释放
void mysql_free_result(MYSQL_RES *result);
 
// 如果执行的SQL语句是无返回结果的,比如DELETE、INSERT等,可以使用以下函数获取影响行数
my_ulonglong mysql_affected_rows(MYSQL *mysql);
 
// 用完连接后需要释放
void mysql_close(MYSQL *mysql);

// MYSQL的函数基本都遵循C语言的编程习惯,当返回值为整数时,0代表成功,非0代表失败,当返回指针时,NULL代表失败
// 如果函数执行失败,获取错误代号
unsigned int mysql_errno(MYSQL *mysql);
// 如果函数执行失败,获取英文错误信息
const char *mysql_error(MYSQL *mysql);
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
安全 Java 关系型数据库
Java连接Mysql SSL初始化失败
Java连接Mysql SSL初始化失败
|
5天前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
16 3
|
3天前
|
关系型数据库 MySQL 数据库
MySQL数据库的增删改查
MySQL数据库的增删改查
8 0
|
6天前
|
关系型数据库 MySQL Java
【Azure 应用服务】应用服务连接 Azure MySQL 一直失败,报错 Create connection error
【Azure 应用服务】应用服务连接 Azure MySQL 一直失败,报错 Create connection error
|
10天前
|
SQL 关系型数据库 MySQL
"Python与MySQL的浪漫邂逅:一键掌握增删改查,开启你的数据库编程之旅!"
【8月更文挑战第21天】Python因其简洁的语法和强大的库支持,成为连接数据库的首选工具。本文介绍如何使用Python连接MySQL数据库并执行基本操作。首先需安装`mysql-connector-python`库。通过配置连接信息建立数据库连接后,可利用`cursor.execute()`执行SQL语句进行数据的增删改查,并通过`commit()`提交更改。查询时使用`fetchall()`或`fetchone()`获取结果。记得处理异常及关闭连接以释放资源。掌握这些基础,有助于高效进行数据库编程。
23 0
|
10天前
|
关系型数据库 MySQL 数据库
postgresql使用mysql_fdw连接mysql
通过以上步骤,你可以在PostgreSQL中访问和查询远程MySQL服务器的数据,这对于数据集成和多数据库管理非常有用。
31 0
|
12天前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之连接到MySQL的从库时遇到其他服务也连接到了从库,该如何处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
9天前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
47 2
|
4天前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
|
8天前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
下一篇
云函数