[C.C++] 深入探索MySQL C API:使用C语言操作MySQL数据库

1031 0
Honkers 2025-4-29 22:25:30 来自手机 | 显示全部楼层 |阅读模式

目录

引言

一. MySQL C API简介

二. MySQL C API核心函数

2.1 初始化和连接

2.2 配置和执行

2.3 处理结果

2.4 清理和关闭

2.5 错误处理

三. MySQL使用过程

四. 实现CRUD操作

4.1 创建数据库并建立表

​编辑

4.2 添加数据(Create)

​编辑

​编辑

​编辑4.3 修改数据(Update)

​编辑

4.4 删除数据(Delete)

4.5 查询数据(Retrieve)

结语


引言

在软件开发中,数据库是存储、检索和操作数据的关键组件。MySQL作为一种广泛使用的数据库系统,提供了丰富的API接口,允许开发者通过不同的编程语言与其交互。本文将详细介绍如何使用MySQL的C语言API来实现数据库的基本增删改查(CRUD)操作。

一. MySQL C API简介

MySQL C API是一组函数,它们提供了对MySQL服务器的底层访问。通过这个API,开发者可以在C语言程序中执行SQL语句并处理结果。

二. MySQL C API核心函数

  1. // Mysql操作句柄初始化
  2. MYSQL *mysql_init(MYSQL *mysql);
  3. // 参数为空则动态申请句柄空间进⾏初始化
  4. // 失败返回NULL
  5. // 连接mysql服务器
  6. MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
  7. const char *passwd, const char *db, unsigned int port,
  8. const char *unix_socket, unsigned long client_flag);
  9. // mysql--初始化完成的句柄
  10. // host---连接的mysql服务器的地址
  11. // user---连接的服务器的⽤⼾名
  12. // passwd-连接的服务器的密码
  13. // db ----默认选择的数据库名称
  14. // port---连接的服务器的端⼝: 默认0是3306端⼝
  15. // unix_socket---通信管道⽂件或者socket⽂件,通常置NULL
  16. // client_flag---客⼾端标志位,通常置0
  17. // 返回值:成功返回句柄,失败返回NULL
  18. // 设置当前客⼾端的字符集
  19. int mysql_set_character_set(MYSQL *mysql, const char *csname)
  20. // mysql--初始化完成的句柄
  21. // csname--字符集名称,通常:"utf8"
  22. // 返回值:成功返回0, 失败返回⾮0;
  23. // 选择操作的数据库
  24. int mysql_select_db(MYSQL *mysql, const char *db)
  25. // mysql--初始化完成的句柄
  26. // db-----要切换选择的数据库名称
  27. // 返回值:成功返回0, 失败返回⾮0;
  28. // 执⾏sql语句
  29. int mysql_query(MYSQL *mysql, const char *stmt_str)
  30. // mysql--初始化完成的句柄
  31. // stmt_str--要执⾏的sql语句
  32. // 返回值:成功返回0, 失败返回⾮0;
  33. // 保存查询结果到本地
  34. MYSQL_RES *mysql_store_result(MYSQL *mysql)
  35. // mysql--初始化完成的句柄
  36. // 返回值:成功返回结果集的指针, 失败返回NULL;
  37. // 获取结果集中的⾏数与列数
  38. uint64_t mysql_num_rows(MYSQL_RES *result);
  39. //result--保存到本地的结果集地址
  40. // 返回值:结果集中数据的条数;
  41. // 获取结果中列的个数
  42. unsigned int mysql_num_fields(MYSQL_RES *result)
  43. // result--保存到本地的结果集地址
  44. // 返回值:结果集中每⼀条数据的列数;
  45. // 遍历结果集
  46. MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
  47. // result--保存到本地的结果集地址
  48. // 返回值:实际上是⼀个char **的指针,将每⼀条数据做成了字符串指针数组 row[0]-第0列row[1] -第1列
  49. // 并且这个接⼝会保存当前读取结果位置,每次获取的都是下⼀条数据
  50. // 释放结果集
  51. void mysql_free_result(MYSQL_RES *result)
  52. // result--保存到本地的结果集地址
  53. // 返回值:void
  54. // 关闭数据库客⼾端连接,销毁句柄:
  55. void mysql_close(MYSQL *mysql)
  56. // 获取mysql接⼝执⾏错误原因
  57. const char *mysql_error(MYSQL *mysql)
复制代码

2.1 初始化和连接

  • mysql_init:初始化MySQL操作句柄。
  • mysql_real_connect:使用给定的参数连接到MySQL服务器。

2.2 配置和执行

  • mysql_set_character_set:设置客户端字符集。
  • mysql_select_db:选择要操作的数据库。
  • mysql_query:执行SQL语句。

2.3 处理结果

  • mysql_store_result:保存查询结果到本地。
  • mysql_num_rows和mysql_num_fields:获取结果集中的行数和列数。
  • mysql_fetch_row:遍历结果集,获取单行数据。

2.4 清理和关闭

  • mysql_free_result:释放结果集资源。
  • mysql_close:关闭数据库连接,销毁句柄。

2.5 错误处理

  • mysql_error:获取MySQL接口执行错误原因。

三. MySQL使用过程

  • 初始化MySQL句柄

    • 使用mysql_init函数初始化一个MySQL连接句柄,为后续操作做准备。
  • 连接到MySQL服务器

    • 使用mysql_real_connect函数连接到MySQL服务器,需要提供主机地址、用户名、密码、数据库名等信息。
  • 设置字符集

    • 使用mysql_set_character_set设置客户端字符集,以确保字符编码的一致性。
  • 执行SQL语句

    • 使用mysql_query执行SQL语句,可以是查询、插入、更新或删除等操作。
  • 处理查询结果(对于查询操作):

    • 如果执行的是查询操作,可以使用mysql_store_result保存结果集,然后通过mysql_fetch_row逐行读取数据。
  • 错误处理

    • 在每个步骤中,如果操作失败,可以使用mysql_error获取错误信息。
  • 清理资源

    • 使用完MySQL句柄后,使用mysql_free_result释放结果集资源(如果有查询操作),然后使用mysql_close关闭连接,释放句柄资源。
  • 关闭连接

    • 最后,关闭与MySQL服务器的连接,清理分配的资源。

四. 实现CRUD操作

4.1 创建数据库并建立表

  1. create database if not exists test_db;
  2. use test_db;
  3. create table if not exists test_tb(
  4. id int primary key auto_increment,
  5. age int,
  6. name varchar(32),
  7. score decimal(4, 2)
  8. );
复制代码

4.2 添加数据(Create)

使用insert语句向数据库表中添加新记录。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <mysql/mysql.h>
  6. #define HOST "127.0.0.1"
  7. #define USER "root"
  8. #define PASSWD "mima"
  9. #define DBNAME "test_db"
  10. void add(MYSQL *mysql)
  11. {
  12. char *sql = "insert into test_tb values(null, 18, '张三', 88.88), (null, 17, '李四', 77);";
  13. int ret = mysql_query(mysql, sql);
  14. if (ret != 0)
  15. {
  16. printf("mysql query error:%s\n", mysql_error(mysql));
  17. return;
  18. }
  19. return;
  20. }
  21. int main()
  22. {
  23. MYSQL *mysql = mysql_init(NULL);
  24. if (mysql == NULL)
  25. {
  26. printf("init mysql handle failed!\n");
  27. return -1;
  28. }
  29. if (mysql_real_connect(mysql, HOST, USER, PASSWD, DBNAME, 0, NULL, 0) ==
  30. NULL)
  31. {
  32. printf("mysql connect error:%s\n", mysql_error(mysql));
  33. return -1;
  34. }
  35. mysql_set_character_set(mysql, "utf8");
  36. add(mysql);
  37. mysql_close(mysql);
  38. return 0;
  39. }
复制代码

编译并运行 +运行结果

4.3 修改数据(Update)

使用update语句更新表中的现有记录。

  1. void mod(MYSQL *mysql)
  2. {
  3. char *sql = "update test_tb set age=34 where name='张三';";
  4. int ret = mysql_query(mysql, sql);
  5. if (ret != 0)
  6. {
  7. printf("mysql query error:%s\n", mysql_error(mysql));
  8. return;
  9. }
  10. return;
  11. }
复制代码

运行结果

4.4 删除数据(Delete)

使用delete语句从表中删除记录。

  1. void del(MYSQL *mysql)
  2. {
  3. char *sql = "delete from test_tb where name='张三';";
  4. int ret = mysql_query(mysql, sql);
  5. if (ret != 0)
  6. {
  7. printf("mysql query error:%s\n", mysql_error(mysql));
  8. return;
  9. }
  10. return;
  11. }
复制代码

运行结果

4.5 查询数据(Retrieve)

使用select语句检索表中的数据。

  1. void get(MYSQL *mysql)
  2. {
  3. char *sql = "select * from test_tb;";
  4. int ret = mysql_query(mysql, sql);
  5. if (ret != 0)
  6. {
  7. printf("mysql query error:%s\n", mysql_error(mysql));
  8. return;
  9. }
  10. MYSQL_RES *res = mysql_store_result(mysql);
  11. if (res == NULL)
  12. {
  13. printf("mysql store result error:%s\n", mysql_error(mysql));
  14. return;
  15. }
  16. int row = mysql_num_rows(res);
  17. int col = mysql_num_fields(res);
  18. printf("%10s%10s%10s%10s\n", "ID", "年龄", "姓名", "成绩");
  19. for (int i = 0; i < row; i++)
  20. {
  21. MYSQL_ROW row_data = mysql_fetch_row(res);
  22. for (int i = 0; i < col; i++)
  23. {
  24. printf("%10s", row_data[i]);
  25. }
  26. printf("\n");
  27. }
  28. mysql_free_result(res);
  29. return;
  30. }
复制代码

运行结果

结语

通过本文的介绍,你应该对MySQL的C语言API有了深入的了解。使用这些API,你可以在C语言项目中实现对MySQL数据库的高效操作。虽然现代开发中更倾向于使用高级语言和ORM框架,但直接使用MySQL C API为理解数据库操作的细节提供了宝贵的视角。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行