【C/C++学院】(22)Mysql数据库编程--C语言操作数据库

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: <p>makefile</p> <p></p> <pre code_snippet_id="613565" snippet_file_name="blog_20150306_1_3096831" name="code" class="cpp">.SUFFIXES: .c .oCC=gccSRCS=mysql1.c OBJS=$(SRCS:.c=.o)EXEC=mys

makefile

.SUFFIXES: .c .o

CC=gcc
SRCS=mysql1.c
			
	
OBJS=$(SRCS:.c=.o)
EXEC=mysql1

all: $(OBJS)
	$(CC) -o $(EXEC) $(OBJS) -lmysqlclient
	@echo '-------------ok--------------'

.c.o:
	$(CC) -Wall -g -o $@ -c $< 

clean:
	rm -f $(OBJS)
	rm -f core*

mysql1.c

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

#define BUFSIZE 1024

MYSQL mysql, *connection;

void deletename(char *SQL)
{
	memset(SQL, 0, BUFSIZE);
	sprintf(SQL, "%s", "请输入要干掉的名字>:");
	write(STDOUT_FILENO, SQL, strlen(SQL)); //这句话是替代printf函数的,这样写就不需要\n也能向屏幕输出了
	char name[1024];
	memset(name, 0, sizeof(name));
	read(STDIN_FILENO, name, sizeof(name)); //等待 用户输入要删除的名字,假设用户输入的是"饭岛爱"
	name[strlen(name) - 1] = 0; //将字符串最后一位\n替换为0,最后放的是整数0,而不是字符'0'

	memset(SQL, 0, BUFSIZE);
	sprintf(SQL, "DELETE FROM table1 WHERE name = '%s'", name); //
	//SQL = DELETE FROM table1 WHERE name = '饭岛爱'
	printf("'%s'\n", SQL);
}

void insertname(char *SQL)
{
	memset(SQL, 0, BUFSIZE);
	sprintf(SQL, "%s", "请输入要插入的名字>:");
	write(STDOUT_FILENO, SQL, BUFSIZE); //这句话是替代printf函数的,这样写就不需要\n也能向屏幕输出了
	char name[1024];
	memset(name, 0, sizeof(name));
	read(STDIN_FILENO, name, sizeof(name)); //等待 用户输入要插入的名字,假设用户输入的是"饭岛爱"
	name[strlen(name) - 1] = 0; //将字符串最后一位\n替换为0,最后放的是整数0,而不是字符'0'

	memset(SQL, 0, BUFSIZE);
	sprintf(SQL, "%s", "请输入要插入的性别>:");
	write(STDOUT_FILENO, SQL, strlen(SQL));
	char sex[1024];
	memset(sex, 0, sizeof(sex));
	read(STDIN_FILENO, sex, sizeof(sex)); //等待 用户输入要插入的性别,
	sex[strlen(sex) - 1] = 0; //将字符串最后一位\n替换为0,最后放的是整数0,而不是字符'0'

	memset(SQL, 0, BUFSIZE);
	sprintf(SQL, "%s", "请输入要插入的年龄>:");
	write(STDOUT_FILENO, SQL, strlen(SQL));
	char age[1024];
	memset(age, 0, sizeof(age));
	read(STDIN_FILENO, age, sizeof(age)); //等待 用户输入要插入的年龄
	age[strlen(age) - 1] = 0; //将字符串最后一位\n替换为0,最后放的是整数0,而不是字符'0'

	memset(SQL, 0, BUFSIZE);
	sprintf(SQL, "%s", "请输入要插入的班级>:");
	write(STDOUT_FILENO, SQL, strlen(SQL));
	char classes[1024];
	memset(classes, 0, sizeof(classes));
	read(STDIN_FILENO, classes, sizeof(classes)); //等待 用户输入要插入的班级
	classes[strlen(classes) - 1] = 0; //将字符串最后一位\n替换为0,最后放的是整数0,而不是字符'0'

	memset(SQL, 0, BUFSIZE);
	sprintf(SQL,
			"INSERT INTO table1 (name, sex, age, class) VALUES ('%s', '%s', %s, '%s')",
			name, sex, age, classes); //
	//SQL = DELETE FROM table1 WHERE name = '饭岛爱'
	printf("'%s'\n", SQL);
}

void updatename(char *SQL)
{
	memset(SQL, 0, BUFSIZE);
	sprintf(SQL, "%s", "请输入要修改的名字>:");
	write(STDOUT_FILENO, SQL, strlen(SQL)); //这句话是替代printf函数的,这样写就不需要\n也能向屏幕输出了
	char name[1024];
	memset(name, 0, sizeof(name));
	read(STDIN_FILENO, name, sizeof(name)); //等待 用户输入要插入的名字,假设用户输入的是"饭岛爱"
	name[strlen(name) - 1] = 0; //将字符串最后一位\n替换为0,最后放的是整数0,而不是字符'0'

	memset(SQL, 0, BUFSIZE);
	sprintf(SQL, "%s", "请输入要性别的性别>:");
	write(STDOUT_FILENO, SQL, strlen(SQL));
	char sex[1024];
	memset(sex, 0, sizeof(sex));
	read(STDIN_FILENO, sex, sizeof(sex)); //等待 用户输入要插入的性别,
	sex[strlen(sex) - 1] = 0; //将字符串最后一位\n替换为0,最后放的是整数0,而不是字符'0'

	memset(SQL, 0, BUFSIZE);
	sprintf(SQL, "%s", "请输入要年龄的年龄>:");
	write(STDOUT_FILENO, SQL, strlen(SQL));
	char age[1024];
	memset(age, 0, sizeof(age));
	read(STDIN_FILENO, age, sizeof(age)); //等待 用户输入要插入的年龄
	age[strlen(age) - 1] = 0; //将字符串最后一位\n替换为0,最后放的是整数0,而不是字符'0'

	memset(SQL, 0, BUFSIZE);
	sprintf(SQL, "%s", "请输入要修改的班级>:");
	write(STDOUT_FILENO, SQL, strlen(SQL));
	char classes[1024];
	memset(classes, 0, sizeof(classes));
	read(STDIN_FILENO, classes, sizeof(classes)); //等待 用户输入要插入的班级
	classes[strlen(classes) - 1] = 0; //将字符串最后一位\n替换为0,最后放的是整数0,而不是字符'0'

	memset(SQL, 0, BUFSIZE);
	sprintf(SQL,
			"UPDATE table1 SET sex = '%s', age = %s, class = '%s' WHERE name = '%s'",
			sex, age, classes, name); //
	//SQL = DELETE FROM table1 WHERE name = '饭岛爱'
	printf("'%s'\n", SQL);
}

void selectname(const char *SQL)
{
	/*
	char SQL[1024];
	memset(SQL, 0, BUFSIZE);
	sprintf(SQL, "%s", "请输入要查询的名字>:");
	write(STDOUT_FILENO, SQL, strlen(SQL)); //这句话是替代printf函数的,这样写就不需要\n也能向屏幕输出了
	char name[1024];
	memset(name, 0, sizeof(name));
	read(STDIN_FILENO, name, sizeof(name)); //等待 用户输入要删除的名字,假设用户输入的是"饭岛爱"
	name[strlen(name) - 1] = 0; //将字符串最后一位\n替换为0,最后放的是整数0,而不是字符'0'
	memset(SQL, 0, BUFSIZE);
	if (strlen(name) == 0) //用户没有任何输入,只是敲了回车,长度为0了
	{
		sprintf(SQL, "SELECT * FROM table2"); //
	} else
	{
		sprintf(SQL, "SELECT * FROM table2 where name = '%s'", name); //
	}

	*/
	if (mysql_query(connection, SQL) != 0)
	{
		printf("query error, %s\n", mysql_error(&mysql));
	}

	//调用mysql_store_result得到查询结果,结果放到MYSQL_RES结构当中
	MYSQL_RES *result = mysql_store_result(connection);
	//要知道返回数据集有多少列才能自由的使用各种SELECT语句
	MYSQL_FIELD *field;
	int iFieldCount = 0;
	while (1)
	{
		field = mysql_fetch_field(result); //循环得到列名,如果循环到了列的最后,函数返回NULL
		if (field == NULL)
			break;
		printf("%s\t", field->name);
		iFieldCount++;
	}
	printf("\n");

	//循环遍历每一行
	MYSQL_ROW row;
	while (1)
	{
		row = mysql_fetch_row(result);
		if (row == NULL)
			break;
		int i = 0;
		for (; i < iFieldCount; i++)
		{
			printf("%s\t", (const char *) row[i]);
		}
		printf("\n");
	}
	mysql_free_result(result);
}

int main(int arg, char *args[])
{
	if (arg < 4)
		return -1;

	mysql_init(&mysql);		//相当于SQL内部初始化了一个TCP的socket,同时初始化了SQL必须的内存和一些结构

	//连接到mysql server
	connection = mysql_real_connect(&mysql, args[1], args[2], args[3], args[4],
			0, 0, 0);
	if (connection == NULL)
	{
		printf("connect error, %s\n", mysql_error(&mysql));
		return -1;
	}

	if (mysql_query(connection, "SET NAMES utf8") != 0)		//设置字符集为UTF8
	{
		printf("设置字符集错误, %s\n", mysql_error(&mysql));
	}

	char buf[BUFSIZE];
	memset(buf, 0, sizeof(buf));
	strcpy(buf, "请选择\n1:插入\n2:删除\n3:修改\n4:查询\n");
	write(STDOUT_FILENO, buf, strlen(buf));
	memset(buf, 0, sizeof(buf));
	read(STDIN_FILENO, buf, sizeof(buf));
	if (strncmp(buf, "4", 1) == 0)		//输入用户输入的是4
	{
		memset(buf, 0, sizeof(buf));
		strcpy(buf, "请输入任意SELECt语句");
		write(STDOUT_FILENO, buf, strlen(buf));
		memset(buf, 0, sizeof(buf));
		read(STDIN_FILENO, buf, sizeof(buf));
		selectname(buf);
	} else
	{
		if (strncmp(buf, "1", 1) == 0)		//输入用户输入的是1
		{
			insertname(buf);
		}

		if (strncmp(buf, "2", 1) == 0)		//输入用户输入的是2
		{
			deletename(buf);
		}

		if (strncmp(buf, "3", 1) == 0)		//输入用户输入的是3
		{
			updatename(buf);
		}
		mysql_query(connection, buf);
	}

	mysql_close(connection);		//断开与SQL server的连接

	puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
	return EXIT_SUCCESS;
}



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
存储 算法 Linux
C语言 多进程编程(一)进程创建
本文详细介绍了Linux系统中的进程管理。首先,文章解释了进程的概念及其特点,强调了进程作为操作系统中独立可调度实体的重要性。文章还深入讲解了Linux下的进程管理,包括如何获取进程ID、进程地址空间、虚拟地址与物理地址的区别,以及进程状态管理和优先级设置等内容。此外,还介绍了常用进程管理命令如`ps`、`top`、`pstree`和`kill`的使用方法。最后,文章讨论了进程的创建、退出和等待机制,并展示了如何通过`fork()`、`exec`家族函数以及`wait()`和`waitpid()`函数来管理和控制进程。此外,还介绍了守护进程的创建方法。
C语言 多进程编程(一)进程创建
|
4天前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
4天前
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
4天前
|
消息中间件 Unix Linux
C语言 多进程编程(五)消息队列
本文介绍了Linux系统中多进程通信之消息队列的使用方法。首先通过`ftok()`函数生成消息队列的唯一ID,然后使用`msgget()`创建消息队列,并通过`msgctl()`进行操作,如删除队列。接着,通过`msgsnd()`函数发送消息到消息队列,使用`msgrcv()`函数从队列中接收消息。文章提供了详细的函数原型、参数说明及示例代码,帮助读者理解和应用消息队列进行进程间通信。
|
4天前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
4天前
|
消息中间件 Unix Linux
C语言 多进程编程(二)管道
本文详细介绍了Linux下的进程间通信(IPC),重点讨论了管道通信机制。首先,文章概述了进程间通信的基本概念及重要性,并列举了几种常见的IPC方式。接着深入探讨了管道通信,包括无名管道(匿名管道)和有名管道(命名管道)。无名管道主要用于父子进程间的单向通信,有名管道则可用于任意进程间的通信。文中提供了丰富的示例代码,展示了如何使用`pipe()`和`mkfifo()`函数创建管道,并通过实例演示了如何利用管道进行进程间的消息传递。此外,还分析了管道的特点、优缺点以及如何通过`errno`判断管道是否存在,帮助读者更好地理解和应用管道通信技术。
|
4天前
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。
|
4天前
|
Linux C语言
C语言 多进程编程(七)信号量
本文档详细介绍了进程间通信中的信号量机制。首先解释了资源竞争、临界资源和临界区的概念,并重点阐述了信号量如何解决这些问题。信号量作为一种协调共享资源访问的机制,包括互斥和同步两方面。文档还详细描述了无名信号量的初始化、等待、释放及销毁等操作,并提供了相应的 C 语言示例代码。此外,还介绍了如何创建信号量集合、初始化信号量以及信号量的操作方法。最后,通过实际示例展示了信号量在进程互斥和同步中的应用,包括如何使用信号量避免资源竞争,并实现了父子进程间的同步输出。附带的 `sem.h` 和 `sem.c` 文件提供了信号量操作的具体实现。
|
17天前
|
存储 程序员 C语言
揭秘C语言:这些核心知识你掌握了吗?一篇文章带你突破编程基础,开启高效编码之旅!
【8月更文挑战第22天】C语言作为编程基石,以简洁高效著称,历经数十年仍备受欢迎。本文通过梳理C语言的核心概念,帮助读者深入理解并提升技能。适合各水平读者。基础语法从`main`函数开始,如示例中的“Hello, World!”程序所示。C语言强调头文件包含与语句结尾的分号。变量和数据类型丰富多样,如`int`、`float`、`char`等,合理选择可优化内存使用和性能。指针用于间接访问内存,是C语言的关键特性。控制结构如循环和分支使程序逻辑更灵活。函数支持代码复用与模块化。深入学习还需掌握预处理指令、文件操作等高级特性。通过系统学习与实践,你将能更熟练地使用C语言,构建高效稳定的应用。
28 4
|
15天前
|
存储 算法 NoSQL
基于C语言的简易数据库系统
基于C语言的简易数据库系统
10 1
下一篇
DDNS