一、数据库建模与建库建表
用户admin登入mysql
创建一个数据库
create database KING_DB;#创建数据库 show databases; use KING_DB;#使用数据库
在KING_DB数据库中创建一张表
create table TBL_USER( U_ID int primary key auto_increment, U_NAME varchar(32), U_GENDER varchar(8) );
尝试插入一条数据
insert TBL_USER(U_NAME,U_GENDER) value('King','man');
二、安装libmysqlclient-dev
要用代码去操作数据库,需要安装一个mysql客户端工具,这样才可以在代码中使用
安装libmysqlclient-dev
sudo apt-get install libmysqlclient-dev
三、代码中实现SQL插入数据
#include<mysql.h> #include<stdio.h> #include<string.h> #define KING_DB_SERVER_IP "192.168.192.128" //ip #define KING_DB_SERVER_PORT 3306 //端口号 #define KING_DB_USERNAME "admin" //用户名 #define KING_DB_PASSWORD "123456" //密码 #define KING_DB_DEFAULTDB "KING_DB" //数据库名 //SQL语句 #define SQL_INSERT_TBL_USER "insert TBL_USER(U_NAME,U_GENDER) value('Lee','man');" //C U R D //create update read delete 传说中的:增删改查 int main(){ MYSQL mysql; if(!mysql_init(&mysql)){//mysql初始化并判断是否出错(返回0为失败) printf("mysql_init:%s\n",mysql_error(&mysql));//mysql_error() 函数返回上一个 MySQL 操作产生的文本错误信息 return -1; } if(!mysql_real_connect(&mysql,KING_DB_SERVER_IP,KING_DB_USERNAME,KING_DB_PASSWORD, KING_DB_DEFAULTDB,KING_DB_SERVER_PORT,NULL,0)){ //连接mysql数据库,并判断是否出错(返回0为失败) printf("mysql_real_connect:%s\n",mysql_error(&mysql)); return -2; } //Mysql -->insert if(mysql_real_query(&mysql,SQL_INSERT_TBL_USER,strlen(SQL_INSERT_TBL_USER))){ //(返回0为成功) printf("mysql_real_query:%s\n",mysql_error(&mysql)); } mysql_close(&mysql); return 0; }
四、代码中实现SQL查询操作
#include<mysql.h> #include<stdio.h> #include<string.h> #define KING_DB_SERVER_IP "192.168.192.128" //ip #define KING_DB_SERVER_PORT 3306 //端口号 #define KING_DB_USERNAME "admin" //用户名 #define KING_DB_PASSWORD "123456" //密码 #define KING_DB_DEFAULTDB "KING_DB" //数据库名 //SQL语句 #define SQL_SELECT_TBL_USER "select * from TBL_USER;" //第一步:要把sql语句发送给mysql服务器 //第二步:把mysql服务器处理结果接受回来,并保存 //第三步:接受的数据(判断多少行多少列) //第四步:抓取我们想要的数据 int king_mysql_select(MYSQL* handle){ //mysql_real_query--->sql if(mysql_real_query(handle,SQL_SELECT_TBL_USER,strlen(SQL_SELECT_TBL_USER))){ //(返回0为成功) printf("mysql_real_query:%s\n",mysql_error(handle)); return -1; } //store 当查询语句执行完之后,数据就已经接收到了管道的数据(mysql服务器发送的),因此要存储起来 MYSQL_RES *res=mysql_store_result(handle); if(res==NULL){ printf("mysql_store_result:%s\n",mysql_error(handle)); return -2; } //rows/fields 行/列 int rows=mysql_num_rows(res); printf("rows:%d\n",rows); int fields = mysql_num_fields(res); printf("fields:%d\n",fields); //fetch MYSQL_ROW row;//定义一行的数据 while(row=mysql_fetch_row(res)){ for(int i=0;i<fields;i++){ printf("%s\t",row[i]); } printf("\n"); } mysql_free_result(res); return 0; } //C U R D //create update read delete 传说中的:增删改查 int main(){ MYSQL mysql; if(!mysql_init(&mysql)){//mysql初始化并判断是否出错(返回0为失败) printf("mysql_init:%s\n",mysql_error(&mysql));//mysql_error() 函数返回上一个 MySQL 操作产生的文本错误信息 return -1; } if(!mysql_real_connect(&mysql,KING_DB_SERVER_IP,KING_DB_USERNAME,KING_DB_PASSWORD, KING_DB_DEFAULTDB,KING_DB_SERVER_PORT,NULL,0)){ //连接mysql数据库,并判断是否出错(返回0为失败) printf("mysql_real_connect:%s\n",mysql_error(&mysql)); return -2; } //Mysql-->select king_mysql_select(&mysql); mysql_close(&mysql); return 0; }
五、代码中实现SQL数据删除(以及存储过程调用)
要根据主键删除才是安全的,因为其他键可能会出现重复,不安全
如果直接执行下面这句会报错,因为不安全。
delete from TBL_USER where U_NAME='Dog';
如果非要这样操作,则需要进入安全模式
set SQL_SAFE_UPDATES=0; delete from TBL_USER where U_NAME='Dog'; set SQL_SAFE_UPDATES=1;
但是如何把这三句话放入一个sql语句中呢
使用存储过程的方式,将语句打包在一起。
主要还要DELIMITER作为定界符,随意取什么符号@@、$$都行
DELIMITER @@ create procedure PROC_DELETE_USER(in UNAME varchar(32)) begin set SQL_SAFE_UPDATES=0; delete from TBL_USER where U_NAME=UNAME; set SQL_SAFE_UPDATES=1; end@@
在该数据库定义好该函数后,以后一直都可以使用。
只需要调用下面就行了
CALL PROC_DELETE_USER('Dog');
完整代码
#include<mysql.h> #include<stdio.h> #include<string.h> #define KING_DB_SERVER_IP "192.168.192.128" //ip #define KING_DB_SERVER_PORT 3306 //端口号 #define KING_DB_USERNAME "admin" //用户名 #define KING_DB_PASSWORD "123456" //密码 #define KING_DB_DEFAULTDB "KING_DB" //数据库名 //SQL语句 #define SQL_INSERT_TBL_USER "insert TBL_USER(U_NAME,U_GENDER) value('Lee','man');" #define SQL_SELECT_TBL_USER "select * from TBL_USER;" #define SQL_DELETE_TBL_USER "CALL PROC_DELETE_USER('Dog');" //******查询******/// //第一步:要把sql语句发送给mysql服务器 //第二步:把mysql服务器处理结果接受回来,并保存 //第三步:接受的数据(判断多少行多少列) //第四步:抓取我们想要的数据 int king_mysql_select(MYSQL* handle){ //mysql_real_query--->sql if(mysql_real_query(handle,SQL_SELECT_TBL_USER,strlen(SQL_SELECT_TBL_USER))){ //(返回0为成功) printf("mysql_real_query:%s\n",mysql_error(handle)); return -1; } //store 当查询语句执行完之后,数据就已经接收到了管道的数据(mysql服务器发送的),因此要存储起来 MYSQL_RES *res=mysql_store_result(handle); if(res==NULL){ printf("mysql_store_result:%s\n",mysql_error(handle)); return -2; } //rows/fields 行/列 int rows=mysql_num_rows(res); printf("rows:%d\n",rows); int fields = mysql_num_fields(res); printf("fields:%d\n",fields); //fetch MYSQL_ROW row;//定义一行的数据 while(row=mysql_fetch_row(res)){ for(int i=0;i<fields;i++){ printf("%s\t",row[i]); } printf("\n"); } mysql_free_result(res); return 0; } //C U R D //create update read delete 传说中的:增删改查 int main(){ MYSQL mysql; if(!mysql_init(&mysql)){//mysql初始化并判断是否出错(返回0为失败) printf("mysql_init:%s\n",mysql_error(&mysql));//mysql_error() 函数返回上一个 MySQL 操作产生的文本错误信息 return -1; } if(!mysql_real_connect(&mysql,KING_DB_SERVER_IP,KING_DB_USERNAME,KING_DB_PASSWORD, KING_DB_DEFAULTDB,KING_DB_SERVER_PORT,NULL,0)){ //连接mysql数据库,并判断是否出错(返回0为失败) printf("mysql_real_connect:%s\n",mysql_error(&mysql)); return -2; } #if 0 //Mysql->select king_mysql_select(&mysql); #endif #if 0 //Mysql -->insert if(mysql_real_query(&mysql,SQL_INSERT_TBL_USER,strlen(SQL_INSERT_TBL_USER))){ //(返回0为成功) printf("mysql_real_query:%s\n",mysql_error(&mysql)); } #endif #if 1 //mysql-->delete if(mysql_real_query(&mysql,SQL_DELETE_TBL_USER,strlen(SQL_DELETE_TBL_USER))){ //(返回0为成功) printf("mysql_real_query:%s\n",mysql_error(&mysql)); } #endif mysql_close(&mysql); return 0; }
六、补充
1.mysql.h
在vscode中导入并正确编译
查找头文件位置
mysql_config --cflags
查找链接库位置
mysql_config --libs
因此只要将下面,插入到vscode编译指令中即可
“-I/usr/include/mysql”,
“-lmysqlclient”,
在vscode中,另外还要加入头文件,不然编辑器会显示红字,特别难受
ctrl+shift+p 选择Edit Configuration(UI)
包含路径添加,这样就不会有红字了
于是就能编译成功了