Linux C/C++ 学习笔记(五):Mysql C/C++编程 创建 插入 读取 删除 存储过程

本文参考Linux C/C++ 开发(学习笔记七):Mysql数据库C/C++编程实现 插入/读取/删除_菊头蝙蝠的博客-优快云博客

一、数据库建模与建库建表

  在设计数据库时,对现实世界进行分析、抽象、并从中找出内在联系,进而确定数据库的结构,这一过程就称为数据库建模。 

在数据库名后加_DB后缀,在数据表前加TBL_前缀,可读性更强

创建并使用数据库

create database KING_DB;  # 创建数据库
show databases;
use KING_DB;

在数据库中建表

create table TBL_USER(
U_ID int primary key auto_increment, #int类型 主键 自增
U_NAME varchar(32),
U_GENDER varchar(8)
);

插入一条数据

insert TBL_USER(U_NAME,U_GENDER) value('King','man');

二、安装libmysqlclient-dev

使用C语言访问MySQL需要安装MySQL C/C++客户端api(MySQL C/C++客户端api):

sudo apt-get install libmysqlclient-dev

三、代码中实现SQL插入数据

 注意,ubuntu下的mysql.h头文件在/usr/include/mysql/下,编译时

gcc main.c -o mysql -I /usr/include/mysql/ -lmysqlclient
#include <stdio.h>
#include <mysql.h>
#include <string.h>

#define KING_DB_SERVER_IP "192.168.131.134"
#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');"

int main() {
    MYSQL  mysql;
    if(!mysql_init(&mysql)){ //mysql初始化并判断是否出错(返回0为失败)
        printf("mysql_init:%s\n",mysql_error(&mysql));//对于由mysql指定的连接,对于失败的最近调用的API函数,mysql_error()返回包含错误消息的、由Null终结的字符串。如果该函数未失败,mysql_error()的返回值可能是以前的错误,或指明无错误的空字符串。
        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(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.131.134" //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 *mysql_store_result(MYSQL *mysql)
    //返回 具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL。
    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 mysql_fetch_row(MYSQL_RES *result) 返回下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL。
    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;

}


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;

使用存储过程的方式,将语句打包在一起。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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值