linux下使用C语言操作MYSQL数据库(API使用libmysqlclient-dev)


运行环境

Ubuntu20.04 虚拟机
Mysql 8.0 API libmysqlclient-dev
gcc 9.4.0


一、准备工作

1、在Ubuntu上准备mysql开发环境

更新软件源

sudo apt update

安装libmysqlclient-dev,这个lib库是Linux下C/C++连接mysql的客户端,
关于libmysqlclient-dev接口与数据类型的介绍请见我的另一篇文章
-->https://blog.csdn.net/goosse/article/details/124287883

sudo apt install libmysqlclient-dev

2、创建测试数据库与表

创建一个名为C_DB的数据库,在库中建立一张名为C_TBL的表

CREATE DATABASE C_DB;
USE C_DB;
CREATE TABLE C_TBL(
ID INT PRIMARY KEY AUTO_INCREMENT,#主键且自增
NAME VARCHAR(32),
SEX VARCHAR(8)
);

二、建立与mysql的连接

1、在C文件中引入头文件

在C文件中引入头文件#inlude<mysql.h>
通过MYSQL mysql;创建一个mysql结构体对象
MYSQL结构体定义在mysql.h

#include<mysql.h>
#include<stdio.h>
#include<string.h>
int main()
{
	 MYSQL mysql;
}

2、初始化mysql与数据库的通道

mysql_init函数初始化失败会返回NULL
mysql_error是mysql API提供的标准错误

	 if(mysql_init(&mysql) == NULL)
    {
        printf("%s",mysql_error(&mysql));
        return -1;
    }

3、与mysql建立真实连接

先在文件最前面定义一些宏,方便后面使用

#define C_DB_SERVER_IP   "192.168.186.128" //要连接的数据库IP
#define C_DB_SERVER_PORT 3306			   //要连接的端口号
#define C_DB_USERNAME    "admin"		   //mysql用户名
#define C_DB_PASSWORD    "admin"		   //mysql密码
#define C_DB_DEFAULT_DB  "C_DB"			   //连接后默认使用的数据库
	//参数依次为 mysql通道,
	//ip,用户名,
	//密码,数据库名,
	//端口号,socket(设置为NULL的时候表示不适用socket),客户端标识符
   	//mysql_real_connect函数若返回0表示则表示连接失败
    if(!mysql_real_connect(&mysql,
	C_DB_SERVER_IP, C_DB_USERNAME, 
    C_DB_PASSWORD, C_DB_DEFAULT_DB, 
    C_DB_SERVER_PORT,NULL, 0))
    {
        printf("mysql_real_connect : %s\n",mysql_error(&mysql));
        return -2;
    }

此时已经通过C代码与MYSQL数据库进行了连接,下一步便可以开始进行数据库的操作

三、添加操作(CRUD - C(CREATE))

定义一个添加数据用的函数int c_db_insert(MYSQL *mysql, char *sql)
第一个参数是传进来的mysql管道,第二个参数传进来要使用的sql语句

int c_db_insert(MYSQL *mysql, char *sql)
{
    if(mysql == NULL)
    {
        printf("%s",mysql_error(mysql));
        return -1;
    }
    //mysql_real_query是操作的关键 参数分别是 mysql管道,sql语句,sql语句长度
    //mysql_real_query 返回0表示成功
    if(mysql_real_query(mysql,sql,strlen(sql)))
    {
        printf("mysql_real_query : %s\n",mysql_error(mysql));
        return -2;
    }
    return 0;
}

四、查询操作(CRUD - R(REMOVE))

定义一个查询数据用的函数int c_db_select(MYSQL *mysql,char *sql)
第一个参数是传进来的mysql管道,第二个参数传进来要使用的sql语句

int c_db_select(MYSQL *mysql,char *sql)
{
    if(mysql == NULL)
    {
        printf("%s",mysql_error(mysql));
        return -1;
    }
    //mysql_real_query是操作的关键 参数分别是 mysql管道,sql语句,sql语句长度
    //mysql_real_query 返回0表示成功
    if(mysql_real_query(mysql,sql,strlen(sql)))
    {
        printf("mysql_real_query : %s\n",mysql_error(mysql));
        return -2;
    }

    //把查到的数据存储在内存中
    //mysql_store_result(mysql)会返回一个MYSQL_RES类型的指针,存储查询sql语句运行的结果
    MYSQL_RES *res = mysql_store_result(mysql);
    if(res == NULL)
    {
        printf("mysql_store_result : %s",mysql_error(mysql));
        return -3;
    }
    //获取列的个数
    int rows = mysql_num_rows(res);
    //获取行的个数
    int fields = mysql_num_fields(res);
    printf("rows = %d fields = %d\n", rows, fields);

    //把结果打印
    //mysql_fetch_row() 返回一个查询结果集的数组
    MYSQL_ROW row;
    while((row = mysql_fetch_row(res)))
    {
        int i = 0;
        for (int i = 0; i < fields; i++)
        {
            printf("%s\t",row[i]);
        }
        printf("\n");
    }
    return 0;
}

五、更改操作(CRUD - U(UPDATE))

定义一个查询数据用的函数int c_db_update(MYSQL *mysql,char *sql)
第一个参数是传进来的mysql管道,第二个参数传进来要使用的sql语句

int c_db_update(MYSQL *mysql,char *sql)
{
    if(mysql == NULL)
    {
        printf("%s",mysql_error(mysql));
        return -1;
    }
    //mysql_real_query是操作的关键 参数分别是 mysql管道,sql语句,sql语句长度
    //mysql_real_query 返回0表示成功
    if(mysql_real_query(mysql,sql,strlen(sql)))
    {
        printf("mysql_real_query : %s\n",mysql_error(mysql));
        return -2;
    }
    return 0;
}

六、删除操作(CRUD - D(DELETE))

在mysql8.0中,通过非主键删除数据会被认定为不安全的操作,所以此处引用mysql的存储过程,来实现通过NAME删除数据,其中SQL_SAFE_UPDATES用于调整安全级别

DELIMITER **
CREATE PROCEDURE PROC_DELETE_USER(IN UNAME VARCHAR(32))
BEGIN
SET SQL_SAFE_UPDATES=0;
DELETE from C_TBL WHERE NAME=UNAME;
SET SQL_SAFE_UPDATES=1;
END**

需要在对应MYSQL服务器中运行这些语句,在之后便可以通过CALL PROC_DELETE_USER(argv)的方式来调用此MYSQL服务器中的名字为 PROC_DELETE_USERPROCEDURE

定义一个查询数据用的函数int c_db_delete(MYSQL *mysql,char *sql)
第一个参数是传进来的mysql管道,第二个参数传进来要使用的sql语句

int c_db_delete(MYSQL *mysql,char *sql)
{
        if(mysql == NULL)
    {
        printf("%s",mysql_error(mysql));
        return -1;
    }
    //mysql_real_query 是操作的关键 参数分别是 mysql管道,sql语句,sql语句长度
    //mysql_real_query 返回0表示成功
    if(mysql_real_query(mysql,sql,strlen(sql)))
    {
        printf("mysql_real_query : %s\n",mysql_error(mysql));
        return -2;
    }
    return 0;
}

完整代码

#include<mysql.h>
#include<stdio.h>
#include<string.h>
#define C_DB_SERVER_IP   "192.168.186.128"
#define C_DB_SERVER_PORT 3306
#define C_DB_USERNAME    "admin"
#define C_DB_PASSWORD    "admin"
#define C_DB_DEFAULT_DB  "C_DB"

//插入
int c_db_insert(MYSQL *mysql, char *sql)
{
    if(mysql == NULL)
    {
        printf("%s",mysql_error(mysql));
        return -1;
    }
    if(mysql_real_query(mysql,sql,strlen(sql)))
    {
        printf("mysql_real_query : %s\n",mysql_error(mysql));
        return -2;
    }
    return 0;
}

//查询
int c_db_select(MYSQL *mysql,char *sql)
{
    if(mysql == NULL)
    {
        printf("%s",mysql_error(mysql));
        return -1;
    }
    //mysql_real_query是操作的关键 参数分别是 mysql管道,sql语句,sql语句长度
    //mysql_real_query 返回0表示成功
    if(mysql_real_query(mysql,sql,strlen(sql)))
    {
        printf("mysql_real_query : %s\n",mysql_error(mysql));
        return -2;
    }

    //把查到的数据存储在内存中
    //mysql_store_result(mysql)会返回一个MYSQL_RES类型的指针,存储查询sql语句运行的结果
    MYSQL_RES *res = mysql_store_result(mysql);
    if(res == NULL)
    {
        printf("mysql_store_result : %s",mysql_error(mysql));
        return -3;
    }
    //获取列的个数
    int rows = mysql_num_rows(res);
    //获取行的个数
    int fields = mysql_num_fields(res);
    printf("rows = %d fields = %d\n", rows, fields);

    //把结果打印
    //mysql_fetch_row() 返回一个查询结果集的数组
    MYSQL_ROW row;
    while((row = mysql_fetch_row(res)))
    {
        int i = 0;
        for (int i = 0; i < fields; i++)
        {
            printf("%s\t",row[i]);
        }
        printf("\n");
    }
    return 0;
}

//更新
int c_db_update(MYSQL *mysql,char *sql)
{
    if(mysql == NULL)
    {
        printf("%s",mysql_error(mysql));
        return -1;
    }
    //mysql_real_query是操作的关键 参数分别是 mysql管道,sql语句,sql语句长度
    //mysql_real_query 返回0表示成功
    if(mysql_real_query(mysql,sql,strlen(sql)))
    {
        printf("mysql_real_query : %s\n",mysql_error(mysql));
        return -2;
    }
    return 0;
}

//删除
int c_db_delete(MYSQL *mysql,char *sql)
{
        if(mysql == NULL)
    {
        printf("%s",mysql_error(mysql));
        return -1;
    }
    //mysql_real_query 是操作的关键 参数分别是 mysql管道,sql语句,sql语句长度
    //mysql_real_query 返回0表示成功
    if(mysql_real_query(mysql,sql,strlen(sql)))
    {
        printf("mysql_real_query : %s\n",mysql_error(mysql));
        return -2;
    }
    return 0;
}

int main()
{
	MYSQL mysql;
    if(mysql_init(&mysql) == NULL)
    {
        printf("mysql_init : %s\n",mysql_error(&mysql));
        return -1;
    }

    // mysql_real_connect 若返回0表示则表示连接失败
    if(!mysql_real_connect(&mysql,
	C_DB_SERVER_IP, C_DB_USERNAME, 
    C_DB_PASSWORD, C_DB_DEFAULT_DB, 
    C_DB_SERVER_PORT,NULL, 0))
    {
        printf("mysql_real_connect : %s\n",mysql_error(&mysql));
        return -2;
    } 

    //添加操作
    // char insert_sql[] = "INSERT C_TBL(NAME, SEX) VALUES('zhangsan','man')";
    // c_db_insert(&mysql,insert_sql);

    //查询操作
    // char select_sql[] = "SELECT * FROM C_TBL";
    // c_db_select(&mysql, select_sql);

    //更新操作
    // char update_sql[] = "UPDATE C_TBL SET NAME='lisi' WHERE ID='1'";
    // c_db_select(&mysql, update_sql);

    //删除操作
    // char delete_sql[] = "CALL PROC_DELETE_USER('zhangsan')";
    // c_db_select(&mysql, delete_sql);

    return 0;
}
  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值