数据库编程

数据库client与server之间也是采用TCP协议

1.初始化client

2.建立连接

3.交互(接收和发送),client向server发送SQL语句,server将执行SQL语句的结果返回给client

4.断开连接


1.头文件应该包含#include<mysql/mysql.h>

2.在gcc编译时链接增加选项为 gcc -lmysqlclient

3.连接到数据库

mysql_init(MYSQL *pmysql);初始化

MYSQL *mysql_real_connect(MYSQL *pmysql,const char *hostname,const char *usename,const char *passwd,const char *dbuname,0,0,0);

连接到mysql必须调用mysql_init对其初始化

之后调用mysql_real_connect连接到数据库,mysql_real_connect成功返回指向mysql连接的指针,失败返回NULL;

4.执行SQL语句

int mysql_query(MYSQL *pmysql,const char *sql);

参数pmysql是连接到MYSQL的指针,参数sql是要执行的SQL语句,成功返回0,失败返回非0

在成功连接到server之后,先执行设置字符集语句set names utf8;再执行SQL语句。


执行SELECT语句得到查询结果

MYSQL_RES *mysql_store_result(MYSQL *pmysql);成功返回一个查询结果指针,查询无结果或错误返回一个NULL

查看查询结果

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

释放相关资源

MYSQL_free_result (MYSQL *res);调用完mysql_store_result一定要释放相关资源

断开连接

mysql_close(MYSQL *pmysql);


使用c语言与数据库相连的实例,可实现增、删、改、查的功能。

实例:

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

MYSQL mysql,*connection;

void deletename()
{
	char SQL[1024];
	memset(SQL,0,sizeof(SQL));
	sprintf(SQL,"%s","请输入要删除的名字>");
	write(STDOUT_FILENO,SQL,sizeof(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
	//char SQL[1024];
	memset(SQL,0,sizeof(SQL));
	sprintf(SQL,"DELETE FROM table1 WHERE name = '%s'",name);//格式化字符串
	//SQL = DELETE FROM table1 WHERE name = '马六'
	if(mysql_query(connection,SQL) != 0)
	{
		printf("query error, %s\n",mysql_error(&mysql));
	}
}

void insert()
{
	char SQL[1024];
	memset(SQL,0,sizeof(SQL));
	sprintf(SQL,"%s","请输入要添加的名字>:");
	write(STDOUT_FILENO,SQL,sizeof(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

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

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

	memset(SQL,0,sizeof(SQL));
	sprintf(SQL,"%s","请输入要添加的班级>:");
	write(STDOUT_FILENO,SQL,sizeof(SQL));
	char classes[1024];
	memset(classes,0,sizeof(classes));
	read(STDIN_FILENO,classes,sizeof(classes));//等待用户输入要添加的班级,假设用户输入的是"c++就业班"
	classes[strlen(classes) - 1] = 0;//将字符串最后一位\n设为0,最后是放的整数0

	memset(SQL,0,sizeof(SQL));
	sprintf(SQL,"INSERT INTO table1(name,sex,age,class) VALUES ( '%s','%s',%s,'%s')",name,sex,age,classes);//格式化字符串
	//SQL = DELETE FROM table1 WHERE name = '马六'
	if(mysql_query(connection,SQL) != 0)
	{
		printf("query error, %s\n",mysql_error(&mysql));
	}
}

void update()
{
	char SQL[1024];
	memset(SQL,0,sizeof(SQL));
	sprintf(SQL,"%s","请输入要修改的名字>:");
	write(STDOUT_FILENO,SQL,sizeof(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

	//将名字修改为此
	memset(SQL,0,sizeof(SQL));
	sprintf(SQL,"%s","请输入更改后的名字>:");
	write(STDOUT_FILENO,SQL,sizeof(SQL));//此句话代替printf不需要\n就可向屏幕打印了
	char update_name[1024];
	memset(update_name,0,sizeof(update_name));
	read(STDIN_FILENO,update_name,sizeof(update_name));//等待用户输入要修改的名字,假设用户输入的是"马六"
	update_name[strlen(update_name) - 1] = 0;//将字符串最后一位\n设为0,最后是放的整数0

	memset(SQL,0,sizeof(SQL));
	sprintf(SQL,"UPDATE table1 SET name = '%s' WHERE name = '%s' ",update_name,name);//格式化字符串
	if(mysql_query(connection,SQL) != 0)
	{
		printf("query error, %s\n",mysql_error(&mysql));
	}
}

void select_name()
{
	char SQL[1024];
	memset(SQL,0,sizeof(SQL));
	sprintf(SQL,"%s","请输入要查询的名字>:");
	write(STDOUT_FILENO,SQL,sizeof(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

	memset(SQL,0,sizeof(SQL));
	sprintf(SQL," SELECT * FROM table1 WHERE name = '%s' ",name);//格式化字符串

	if(mysql_query(connection,SQL) != 0)
	 {
		printf("query error, %s\n",mysql_error(&mysql));
	}
	MYSQL_RES * result = mysql_store_result(connection);//调用mysql_store_result得到查询结果,结果放到MYSQL_RES结构当中
	MYSQL_ROW row;
	while(1)
	{
		row = mysql_fetch_row(result);
		if(row == NULL)
			break;
		else
			printf("name = %s,sex = %s,age = %s,class = %s\n",(const char *)row[0],(const char *)row[1],(const char *)row[2],(const char *)row[3]);
	}
	mysql_free_result(result);
}


int main(int arg,char * args[ ])
{
	if(arg < 4)
	{
		return -1;
	}
	mysql_init(&mysql);//相当于sql内部初始化了一个TCP的socket,同时初始化了sql必须的内存和结构
	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)
	{
		printf("设置字符集错误, %s\n",mysql_error(&mysql));
	}
	char buf[1024];
	memset(buf,0,sizeof(buf));
	strcpy(buf,"请选择\n1:插入\n2:删除\n3:修改\n4:查询\n");
	write(STDOUT_FILENO,buf,sizeof(buf));

	memset(buf,0,sizeof(buf));
	read(STDIN_FILENO,buf,sizeof(buf));
	if(strncmp(buf,"1",1) == 0)
	{
		insert();
	}
	if(strncmp(buf,"2",1) == 0)
	{
		deletename();
	}
	if(strncmp(buf,"3",1) == 0)
	{
		update();
	}
	if(strncmp(buf,"4",1) == 0)
	{
		select_name();
	}
	printf("connect success\n");
	mysql_close(connection);//断开与mysql server的连接
	return EXIT_SUCCESS;
}










  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值