MySQL 如何用C语言连接

✨✨✨励志成为超级技术宅 ✨✨✨


本文主要讲解在Linux服务器上,如何使用c语言MySQL库的接口来对MySQL数据库进行操作,如果没有服务器安装MySQL,也可以先学学看怎么用c语言mysql库的接口,还是比较容易的了。(●☌◡☌●)。那么开始讲解吧!

一.部分接口讲解

我们先来看接口的定义,这部分比较无聊,我们也可以先看第二部分的代码使用 ,再返回来看看。

1.MYSQL *mysql_init(MYSQL *mysql)

作用:对数据库进行初始化,要使用库,必须先进行初始化

参数:MYSQL *mysql:这是一个指向 MYSQL 结构体的指针。如果传入 NULLmysql_init 会分配一个新的 MYSQL 结构体并返回其指针。如果传入一个非 NULL 的指针,mysql_init 会初始化这个已经存在的 MYSQL 结构体。我们一般都是直接传入NULL,如 MYSQL * mysql=mysql_init(nullptr);这样使用就行。

返回值:

  • 成功时,mysql_init 返回一个指向 MYSQL 结构体的指针。这个指针可以用于后续的数据库连接操作。
  • 失败时,返回 NULL。这通常发生在内存分配失败的情况下。

2.MYSQL *mysql_real_connect()

完整接口: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),参数非常复杂我们一个个讲解。

作用:连接mysql服务器。

参数:

  1. MYSQL *mysql:这是一个已经通过 mysql_init 初始化的 MYSQL 连接句柄。
  2. const char *host:MySQL 服务器的主机名或 IP 地址。可以是 NULL"localhost",表示连接到本地服务器。
  3. const char *user:用于连接数据库的用户名。
  4. const char *passwd:对应用户的密码。
  5. const char *db:要连接的数据库名,也可以置为空,后面调用其他接口选择。
  6. unsigned int port:MySQL 服务器的端口号。如果设置为 0,则使用默认端口(通常是 3306)。
  7. const char *unix_socket:UNIX 套接字文件的路径,我们通常设置为 NUll,使用默认的 UNIX 套接字文件路径。
  8. unsigned long client_flag:客户端标志,用于指定连接选项。可以是多个标志的按位或组合,比如 CLIENT_INTERACTIVECLIENT_FOUND_ROWS 等,我们通常置为0就行。

返回值:

  • 成功时,mysql_real_connect 返回一个指向 MYSQL 结构体的指针(与传入的 mysql 参数相同)。这个指针表示一个成功的数据库连接,可以用于后续的数据库操作。
  • 失败时,返回 NULL。此时,可以通过调用 mysql_error 函数来获取关于连接失败的更多信息。

3. int mysql_set_character_set(MYSQL *mysql, const char *csname)

作用:设置数据库字符集

参数:1.初始化的 MYSQL 连接句柄,2要设计的字符集名称

返回值:

  • 成功时,mysql_set_character_set 返回 0
  • 失败时,返回非零值。此时,可以通过调用 mysql_error 函数来获取关于设置字符集失败的更多信息。

4.int mysql_query(MYSQL *mysql, const char *q)

作用:执行sql语句

参数:1.初始化的 MYSQL 连接句柄,2要执行的sql语句

返回值:

  • 成功时, 返回 0
  • 失败时,返回非零值。此时,可以通过调用 mysql_error 函数来获取关于设置字符集失败的更多信息。

5.void mysql_close(MYSQL*mysql)

作用:关闭连接,释放句柄

参数:初始化的 MYSQL 连接句柄

二.代码使用

首先我们先登入MySQL客户端查看并选择我们需要连接的数据库

这里我们选择gobang数据库进行连接。

我们直接看代码来学学看怎么使用:

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

#define HOST "127.0.0.1"
#define PORT 3306
#define USER "root"
#define PASS "147258Ll!"
#define DBNAME "gobang"
int main()
{
    //1. 初始化mysql句柄
    // MYSQL *mysql_init(MYSQL *mysql);
    MYSQL * mysql=mysql_init(nullptr);


    //2. 连接服务器
    // MYSQL *mysql_real_connect(mysql, host, user, pass, dbname, port, unix_socket, flag);
    mysql_real_connect(mysql,HOST,USER,PASS,DBNAME,PORT,nullptr,0);


     //3. 设置客户端字符集
    // int mysql_set_character_set(mysql, "utf8");
    int ret=mysql_set_character_set(mysql,"utf8");


    //4. 选择要操作的数据库
    //之前选择了数据库这里可以不写
    // int mysql_select_db(mysql, dbname)
    //mysql_select_db(mysql, DBNAME);

      //5. 执行sql语句
    // int mysql_query(MYSQL *mysql,  char *sql);
    const char *sql = "insert stu values(100,'xixi','17');";
    mysql_query(mysql,sql);

    //6.关闭连接,释放句柄
    mysql_close(mysql);
    return 0;
}

这里我们通过c语言接口连接gobang数据库,并向stu表插入一条数据(100,xixi,17)。

我们先来看看表结构:

表中有三个属性id,name,age,运行上面的代码我们来看看结果 。

可以看到插入成功。但是这里我们执行的SQL语句并不需要结果数据,如果是select语句需要返回结果集,我们要看到对应的结果那么应该如何使用?这里我们还要学学其他接口

三.与结果集有关的其他接口

1.MYSQL_RES *mysql_store_result(MYSQL *mysql)

作用:讲sql语句执行的保存结果到本地

参数:mysql句柄

返回值:指向结果集的指针,失败为空

2.int mysql_num_rows(MYSQL_RES *res)和int mysql_num_fields(res);

作用:获取结果集的行数和列数

参数:结果集指针

返回值:行数和列数

3.MYSQL_ROW mysql_fetch_row(MYSQL_RES*res)

作用:按行遍历结果集

参数:结果集指针

返回值:MYSQL_ROW ,本质是二级指针char* *,指向一行结果集的一条记录,访问过后会自动移向下一条记录。

我们在使用过程会通常会讲上面的接口一起结合起来遍历结果集。

四.代码使用

我们再来看看包含所有接口的代码:

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

#define HOST "127.0.0.1"
#define PORT 3306
#define USER "root"
#define PASS "147258Ll!"
#define DBNAME "gobang"
int main()
{
    //1. 初始化mysql句柄
    // MYSQL *mysql_init(MYSQL *mysql);
    MYSQL * mysql=mysql_init(nullptr);


    //2. 连接服务器
    // MYSQL *mysql_real_connect(mysql, host, user, pass, dbname, port, unix_socket, flag);
    mysql_real_connect(mysql,HOST,USER,PASS,DBNAME,PORT,nullptr,0);


     //3. 设置客户端字符集
    // int mysql_set_character_set(mysql, "utf8");
    int ret=mysql_set_character_set(mysql,"utf8");


    //4. 选择要操作的数据库
    // int mysql_select_db(mysql, dbname)
    mysql_select_db(mysql, DBNAME);

      //5. 执行sql语句
    // int mysql_query(MYSQL *mysql,  char *sql);
    const char *sql = "insert stu values(100,'xixi','17');";
    mysql_query(mysql,sql);
    const char*sql2="select *from stu;";
    mysql_query(mysql,sql2);



    //6. 如果sql语句是查询语句,则需要保存结果到本地
    // MYSQL_RES *mysql_store_result(MYSQL *mysql)
     MYSQL_RES *res=mysql_store_result(mysql);



     //7. 获取结果集中的结果条数
    // int mysql_num_rows(MYSQL_RES *res);
    // int mysql_num_fields(MYSQL_RES *res);
    int rows_num=mysql_num_rows(res);
    int cols_num=mysql_num_fields(res);


    //8. 遍历保存到本地的结果集
    for(int i=0;i<rows_num;i++)
    {
        MYSQL_ROW row = mysql_fetch_row(res);
        for(int j=0;j<cols_num;j++)
        {
            std::cout<<row[j]<<std::endl;
        }
    }

    //9. 释放结果集
     mysql_free_result(res);
   
    //10. 关闭连接,释放句柄
    mysql_close(mysql);
    return 0;
}

运行结果:

用c语言连接数据库就讲解到这了,我们只要按流程依此使用相关接口就行了,还是挺简单的吧,感觉有帮助还请点个赞了,这真的很重要!(๑•́ ₃ •̀๑)/

相关推荐
做梦敲代码41 分钟前
达梦数据库-读写分离集群部署
数据库·达梦数据库
苹果醋31 小时前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger1 小时前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud2 小时前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡2 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷2 小时前
Redis
数据库·redis·缓存
仰望大佬0072 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名3 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库