数据库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;
}