• MySQL----C语言连接(简略)


    头文件和库文件

    如果/usr/include 下没有mysql.h, /lib64下没有mysql相关库文件,需要到官网下载,将对应的文件复制到对应的文件夹里
    include 包含所有的方法声明, lib 包含所有的方法实现(打包成库)在这里插入图片描述
    在这里插入图片描述

    makefile

    动静态库参考:Linux----IO(初级)

    • -I:告诉gcc除了默认路径以及当前路径,在指定路径下也找一下头文件
    • -L:告诉gcc除了默认路径以及当前路径,在指定路径下也找一下库文件
    • -l:具体链接哪个库(这里是静态库名省略比如libmymath.a,只需要写mymath)

    • 可以将头文件和库文件拷贝到对应目录下
      g++ -o $@ $^ -std=c++11 -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient
    • 也可以使用软链接路径,注意添加环境变量(ldd显示命令依赖的共享库)
    connect:connect.cc
    	g++ -o $@ $^ -std=c++11 -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient
    .PHONY:clean
    clean:
    	rm -f connect
    
    • 1
    • 2
    • 3
    • 4
    • 5

    MYSQL C API

    详细参考:官方c-api文档

    Basic Data Structures

    • MYSQL:此结构表示一个数据库连接的处理程序。它几乎被所有MySQL函数使用,不要尝试复制 MYSQL 结构。无法保证此类副本将可用
      其中的const struct MYSQL_METHODS *methods变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用在这里插入图片描述
    • MYSQL_RES:此结构表示返回行(SELECT、SHOW、DESCRIBE、EXPLAIN)的查询的结果
      在这里插入图片描述
    • MYSQL_ROW:这是一行数据的类型安全表示。 它目前被实现为一个计数字节字符串的数组。 (如果字段值可能包含二进制数据,则不能将它们视为以空值结尾的字符串,因为这些值可能在内部包含空字节)可以通过调用 mysql_fetch_row() 获取行
    typedef char **MYSQL_ROW;   /* return data as array of strings */
    
    • 1
    • MYSQL_FIELD:此结构包含元数据:有关字段的信息,例如字段的名称、类型和大小,可以通过重复调用mysql_fetch_field() 来获取每个字段的 MYSQL_FIELD 结构。 Field values不属于此结构; 它们包含在 MYSQL_ROW 结构中
      在这里插入图片描述
    • 其他:参考 C API Basic Data Structures
    typedef uint64_t my_ulonglong;
    typedef unsigned int MYSQL_FIELD_OFFSET; /* offset to current field */
    ...
    
    • 1
    • 2
    • 3

    Function

    mysql_init()

    要使用库,必须先进行初始化,例如: MYSQL *mfp = mysql_init(NULL)

    // 1. 初始化mysql句柄
       MYSQL *my = mysql_init(nullptr);
       if (my == nullptr)
       {
           std::cerr << "init mysql error" << std::endl;
           return 1;
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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);
    // 2. 链接数据库
    if (mysql_real_connect(my, host.c_str(), user.c_str(),
                          passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
       std::cerr << "connect mysql error" << std::endl;
       return 2;
    }
    mysql_set_character_set(my, "utf8");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    mysql_query()

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

    • 第二个参数为要执行的sql语句
    //3.构建sql
    std::cout << "connect success" << std::endl;
    std::string sql = "insert into students (sn, name, qq) values (";
    sql += "2222, \'jimmy\', \'1234567@qq.com\'";
    sql += ")";
    std::string sql = "delete from students where id=109";
    std::string sql = "update students set name=\'tom\' where id=111";
    std::cout << "excute: " << sql << std::endl;
    
    //std::string sql = "select * from table1";
    // 4. 下达sql命令,mysql会自动执行,reuslt == 0,表明操作成功,其他的标识失败
    if (0 != mysql_query(my, sql.c_str()))
    {
        std::cout << sql << " execute error" << std::endl;
        return 3;
    }
    std::cout << "execute " << sql << " success!" << std::endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    mysql_store_result()

    sql执行完以后,如果是查询语句,我们还要读取数据,如果update,insert等语句,那么就判断操作成功与否:

    • 如果mysql_query返回成功,那么我们就通过mysql_store_result这个函数来读取结果

    函数原型:MYSQL_RES *mysql_store_result(MYSQL *mysql);


    mysql_store_result()函数会调用MYSQL变量中的MYSQL_METHODS *methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要注意 free(result),不然会造成内存泄漏, 执行完mysql_store_result以后,数据都已经在MYSQL_RES 变量中
    下面的api function是读取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_FIELD 结构数组)mysql_fetch_fields:MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
    • 获取结果内容mysql_fetch_row:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
    // 5. select,进行数据分析,得出select的数据!
    MYSQL_RES *result = mysql_store_result(my);//获取结果集
    int rows = mysql_num_rows(result);//获取行数
    int cols = mysql_num_fields(result);//获取列数
    //std::cout << "rows: " << rows << " cols: " << cols << std::endl;
    
    MYSQL_FIELD *f = mysql_fetch_fields(result);//获取列属性
    for (int i = 0; i < cols; i++)
       //循环打印所有列名(也就是MYSQL_FIELD的第一个成员char *name;/* Name of column */)
       std::cout << f[i].name << "\t";
    std::cout << "\n";
    
    //读取选择的数据
    MYSQL_ROW row;// char** 相当于一个二维数组
    for (int i = 0; i < rows; i++)//打印二维数组
    {
       row = mysql_fetch_row(result);
       for(int j = 0; j < cols; j++)
       {
           std::cout << row[j] << "\t";
       }
       std::cout << std::endl;
    }
    
    free(result);// 防止内存泄漏
    mysql_close(my); //关闭mysql链接
    //  std::cout << "client version: " << mysql_get_client_info() << std::endl;
    return 0;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    编译运行:(省略sql构建,直接执行查询语句)
    在这里插入图片描述

    其他函数

    事务等操作
    更多详细参考:C API Function Reference

  • 相关阅读:
    et al和etc区别
    4、linux下文件的通用操作方法
    Docker 部署
    银行利率bp是什么意思,基准利率bp是什么意思
    vmware vsphere用户权限分级
    go mod why
    LDAP注入漏洞
    C#/VB.NET 读取条码类型及条码在图片中的坐标位置
    《LeetCode力扣练习》代码随想录——链表(设计链表---Java)
    [acwing周赛复盘] 第 78 场周赛20221119
  • 原文地址:https://blog.csdn.net/qq_41420788/article/details/126312062