Linux下C语言实现MySQL操作——连接、查询、插入与客户端打造

准备工作

数据库

创建一个数据库(我的是test),并建表(我的是example)
在这里插入图片描述

知识准备

https://blog.csdn.net/weixin_45525272/article/details/108015027

1.连接代码

在这里插入图片描述

/*************************************************************************
    > File Name: connect.c
    > Author: 杨永利
    > Mail: 1795018360@qq.com 
    > Created Time: 2020年08月14日 星期五 20时39分56秒
 ************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>

// 定义连接时所需要的数据宏
#define HOST "127.0.0.1"    // 所连数据库的ip 127.0.0.1是本机ip
#define USER "root"         // 数据库用户
#define PASSWORD "123456"   // 该用户密码(自设)
#define DBNAME "test"       // 要操作的数据库名

int main(int argc, char* argv[])
{
    // 定义mysql指针并初始化
    MYSQL *mysql=mysql_init(NULL);
    if(mysql== NULL)
    {
        printf("init err! 数据库初始化错误!\n");
        return -1;
    }
    // 初始化成功就连接数据库
    mysql = mysql_real_connect(mysql,HOST,USER,PASSWORD,DBNAME,0,NULL,0);
    if(mysql == NULL)
    {
        printf("connect err! 数据库连接失败! \n");
        return -1;
    }
    printf("测试成功!\n");
    // 最后关闭连接
    mysql_close(mysql);

    return 0;
}

2.查询代码

在这里插入图片描述

/*************************************************************************
    > File Name: connect.c
    > Author: 杨永利
    > Mail: 1795018360@qq.com 
    > Created Time: 2020年08月14日 星期五 20时39分56秒
 ************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>

// 定义连接时所需要的数据宏
#define HOST "127.0.0.1"    // 所连数据库的ip 127.0.0.1是本机ip
#define USER "root"         // 数据库用户
#define PASSWORD "123456"   // 该用户密码(自设)
#define DBNAME "test"       // 要操作的数据库名

// 打印结果集函数
void show_result(MYSQL_RES * result)
{
	//打印表头
	unsigned int num_fields;
	unsigned int i;
    // MYSQL_FIELD 该结构包含关于字段的信息,如字段名、类型和大小
	MYSQL_FIELD *fields;
	// 返回结果集中的行数。
	num_fields = mysql_num_fields(result);
    // mysql_fetch_fields 对于结果集,返回所有MYSQL_FIELD结构的数组。每个结构提供了结果集中1列的字段定义。
	fields = mysql_fetch_fields(result);
    // 输出结果
	for(i = 0; i < num_fields; i++)
	{
	   printf("%s\t", fields[i].name);
	}
    // 这个输出是打造表的结构边框便于查看数据,准确的输出按照你的数据自行增加减去+号
	printf("\n+----+-------+\n");
	
	// 行数
	MYSQL_ROW row;
		num_fields = mysql_num_fields(result);//取字段个数
	while ((row = mysql_fetch_row(result)))//循环取一行
	{
	   for(i = 0; i < num_fields; i++)
	   {
           // 看是否为空
	       printf("%s\t",  row[i] ? row[i] : "NULL");
	   }
	   printf("\n");
	}
}


int main(int argc, char* argv[])
{
    // 定义mysql指针并初始化
    MYSQL *mysql=mysql_init(NULL);
    if(mysql== NULL)
    {
        printf("init err! 数据库初始化错误!\n");
        return -1;
    }
    // 初始化成功就连接数据库
    mysql = mysql_real_connect(mysql,HOST,USER,PASSWORD,DBNAME,0,NULL,0);
    if(mysql == NULL)
    {
        printf("connect err! 数据库连接失败! \n");
        return -1;
    }
    printf("数据库连接成功!\n"); 
    
    // 定义查询语句
    char rSql[256]={0};
    // 我的表名为example
    strcpy(rSql,"select * from example");
    // 查询指向的SQL查询
    if(mysql_query(mysql,rSql) != 0){
    	printf("mysql_query err! 查询失败\n");
    	exit(1);
    }

    // 取回结果集
    int i=0;
    // mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
    MYSQL_RES * result = mysql_store_result(mysql);
    MYSQL_ROW row;
    if(result != NULL){
    	//需要打印结果集
    	show_result(result);
		mysql_free_result(result);//释放结果集
    }
    // 最后关闭连接
    mysql_close(mysql);
    printf("数据库关闭成功!\n");
    return 0;
}

3.插入代码

在这里插入图片描述

/*************************************************************************
    > File Name: insert.c
    > Author: 杨永利
    > Mail: 1795018360@qq.com 
    > Created Time: 2020年08月14日 星期五 21时44分30秒
 ************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>

// 定义连接时所需要的数据宏
#define HOST "127.0.0.1"    // 所连数据库的ip 127.0.0.1是本机ip
#define USER "root"         // 数据库用户
#define PASSWORD "123456"   // 该用户密码(自设)
#define DBNAME "test"       // 要操作的数据库名

int main(int argc, char* argv[]){
    // 定义mysql指针并初始化
    MYSQL *mysql=mysql_init(NULL);
    if(mysql== NULL)
    {
        printf("init err! 数据库初始化错误!\n");
        return -1;
    }
    // 初始化成功就连接数据库
    mysql = mysql_real_connect(mysql,HOST,USER,PASSWORD,DBNAME,0,NULL,0);
    if(mysql == NULL)
    {
        printf("connect err! 数据库连接失败! \n");
        return -1;
    }
    printf("数据库连接成功!\n");
    // 定义查询语句
    char rSql[256]={0};
    strcpy(rSql,"insert into example values(4,'admin')");
    if(mysql_query(mysql,rSql) != 0){
    	printf("mysql_query err\n");
    	exit(1);
    }
    printf("数据插入成功!\n");
    // 最后关闭连接
    mysql_close(mysql);

    return 0;
}

4.客户端代码

在这里插入图片描述

/*************************************************************************
    > File Name: client.c
    > Author: 杨永利
    > Mail: 1795018360@qq.com 
    > Created Time: 2020年08月14日 星期五 21时49分15秒
 ************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>

// 定义连接时所需要的数据宏
#define HOST "127.0.0.1"    // 所连数据库的ip 127.0.0.1是本机ip
#define USER "root"         // 数据库用户
#define PASSWORD "123456"   // 该用户密码(自设)
#define DBNAME "test"       // 要操作的数据库名

void show_result(MYSQL_RES * result,MYSQL *mysql)
{
	//打印表头
	unsigned int num_fields;
	unsigned int i;
	MYSQL_FIELD *fields;
	 
	num_fields = mysql_num_fields(result);
	fields = mysql_fetch_fields(result);
	for(i = 0; i < num_fields; i++)
	{
	   printf("%s\t", fields[i].name);
	}
	printf("\n----------------------------------------------------------\n");//华丽分割线
	
	
	MYSQL_ROW row;
		num_fields = mysql_num_fields(result);//取字段个数
	while ((row = mysql_fetch_row(result)))//循环取一行
	{
	   for(i = 0; i < num_fields; i++)
	   {
	       printf("%s\t",  row[i] ? row[i] : "NULL");
	   }
	   printf("\n");
	}
	printf("\n----------------------------------------------------------\n");//华丽分割线
	//3 rows in set (0.28 sec)
	printf("%ld rows in set \n",mysql_affected_rows(mysql));//影响的数目
}

int main(int argc, char* argv[]){
        // 定义mysql指针并初始化
    MYSQL *mysql=mysql_init(NULL);
    if(mysql== NULL)
    {
        printf("init err! 数据库初始化错误!\n");
        return -1;
    }
    // 初始化成功就连接数据库
    mysql = mysql_real_connect(mysql,HOST,USER,PASSWORD,DBNAME,0,NULL,0);
    if(mysql == NULL)
    {
        printf("connect err! 数据库连接失败! \n");
        return -1;
    }
    printf("数据库连接成功!\n");
    
    // 客户端操作
    printf("welcome to mysql!\n");
    char rSql[1024]={0};
    printf("输入quit退出!\n");
    while(1)
    {
        // STDIN_FILENO表示标准输入
        write(STDOUT_FILENO,"yoursql>",8);
		memset(rSql,0x00,sizeof(rSql));
        // 标准输出 STDOUT_FILENO
        read(STDIN_FILENO,rSql,sizeof(rSql));//读入sql
        if(strncmp(rSql,"quit",4) == 0){
			printf("bye bye!欢迎下次使用!\n");
			break;
		}
        //执行sql
		if(mysql_query(mysql,rSql) != 0){
	    	printf("mysql_query err\n");
	    	continue;
	    }
           //取回结果集
	    int i=0;
	    MYSQL_RES * result = mysql_store_result(mysql);
	    MYSQL_ROW row;
	    if(result != NULL){
	    	//需要打印结果集
	    	show_result(result,mysql);
			mysql_free_result(result);//释放结果集
	    }else
        {
	    	//输出例如:Query OK, 1 row affected (0.16 sec)
	    	printf("Query OK, %ld row affected \n",mysql_affected_rows(mysql));
	    	//printf("%ld products updated",(long) mysql_affected_rows(&mysql));
	    }
    }
    // 最后关闭连接
    mysql_close(mysql);
    return 0;
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页