文章目录
运行环境
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_USER
的 PROCEDURE
定义一个查询数据用的函数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;
}