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


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

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

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

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

    创建并使用数据库

    1. create database KING_DB; # 创建数据库
    2. show databases;
    3. use KING_DB;

    在数据库中建表

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

    插入一条数据

    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
    
    1. #include
    2. #include
    3. #include
    4. #define KING_DB_SERVER_IP "192.168.131.134"
    5. #define KING_DB_SERVER_PORT 3306 //端口号
    6. #define KING_DB_USERNAME "admin" //用户名
    7. #define KING_DB_PASSWORD "123456" //密码
    8. #define KING_DB_DEFAULTDB "KING_DB" //数据库名
    9. //SQL语句
    10. #define SQL_INSERT_TBL_USER "insert TBL_USER(U_NAME,U_GENDER) value('Lee','man');"
    11. int main() {
    12. MYSQL mysql;
    13. if(!mysql_init(&mysql)){ //mysql初始化并判断是否出错(返回0为失败)
    14. printf("mysql_init:%s\n",mysql_error(&mysql));//对于由mysql指定的连接,对于失败的最近调用的API函数,mysql_error()返回包含错误消息的、由Null终结的字符串。如果该函数未失败,mysql_error()的返回值可能是以前的错误,或指明无错误的空字符串。
    15. return -1;
    16. }
    17. if(!mysql_real_connect(&mysql,KING_DB_SERVER_IP,KING_DB_USERNAME,KING_DB_PASSWORD,
    18. KING_DB_DEFAULTDB,KING_DB_SERVER_PORT,NULL,0)){ 连接mysql数据库,并判断是否出错(返回0为失败)
    19. printf("mysql_real_connect:%s\n",mysql_error(&mysql));
    20. return -2;
    21. }
    22. if(mysql_real_query(&mysql,SQL_INSERT_TBL_USER,strlen(SQL_INSERT_TBL_USER))){ //(返回0为成功)
    23. printf("mysql_real_query:%s\n",mysql_error(&mysql));
    24. }
    25. mysql_close(&mysql);
    26. return 0;
    27. }

       观察到添加成功

    四、代码中实现SQL查询操作

    1. #include
    2. #include
    3. #include
    4. #define KING_DB_SERVER_IP "192.168.131.134" //ip
    5. #define KING_DB_SERVER_PORT 3306 //端口号
    6. #define KING_DB_USERNAME "admin" //用户名
    7. #define KING_DB_PASSWORD "123456" //密码
    8. #define KING_DB_DEFAULTDB "KING_DB" //数据库名
    9. //SQL语句
    10. #define SQL_SELECT_TBL_USER "select * from TBL_USER;"
    11. //第一步:要把sql语句发送给mysql服务器
    12. //第二步:把mysql服务器处理结果接受回来,并保存
    13. //第三步:接受的数据(判断多少行多少列)
    14. //第四步:抓取我们想要的数据
    15. int king_mysql_select(MYSQL* handle){
    16. //mysql_real_query--->sql
    17. if(mysql_real_query(handle,SQL_SELECT_TBL_USER,strlen(SQL_SELECT_TBL_USER))){ //(返回0为成功)
    18. printf("mysql_real_query:%s\n",mysql_error(handle));
    19. return -1;
    20. }
    21. //store 当查询语句执行完之后,数据就已经接收到了管道的数据(mysql服务器发送的),因此要存储起来
    22. //MYSQL_RES *mysql_store_result(MYSQL *mysql)
    23. //返回 具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL。
    24. MYSQL_RES *res=mysql_store_result(handle);
    25. if(res==NULL){
    26. printf("mysql_store_result:%s\n",mysql_error(handle));
    27. return -2;
    28. }
    29. //rows/fields 行/列
    30. int rows=mysql_num_rows(res);
    31. printf("rows:%d\n",rows);
    32. int fields = mysql_num_fields(res);
    33. printf("fields:%d\n",fields);
    34. //fetch
    35. // MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) 返回下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL。
    36. MYSQL_ROW row;//定义一行的数据
    37. while(row=mysql_fetch_row(res)){
    38. for(int i=0;i
    39. printf("%s\t",row[i]);
    40. }
    41. printf("\n");
    42. }
    43. mysql_free_result(res);
    44. return 0;
    45. }
    46. int main() {
    47. MYSQL mysql;
    48. if(!mysql_init(&mysql)){//mysql初始化并判断是否出错(返回0为失败)
    49. printf("mysql_init:%s\n",mysql_error(&mysql));//mysql_error() 函数返回上一个 MySQL 操作产生的文本错误信息
    50. return -1;
    51. }
    52. if(!mysql_real_connect(&mysql,KING_DB_SERVER_IP,KING_DB_USERNAME,KING_DB_PASSWORD,
    53. KING_DB_DEFAULTDB,KING_DB_SERVER_PORT,NULL,0)){ //连接mysql数据库,并判断是否出错(返回0为失败)
    54. printf("mysql_real_connect:%s\n",mysql_error(&mysql));
    55. return -2;
    56. }
    57. //Mysql-->select
    58. king_mysql_select(&mysql);
    59. mysql_close(&mysql);
    60. return 0;
    61. }

     五、代码中实现SQL数据删除(以及存储过程调用)

    要根据主键删除才是安全的,因为其他键可能会出现重复,不安全

    如果直接执行下面这句会报错,因为不安全。

    delete from TBL_USER where U_NAME='Dog';

    如果非要这样操作,则需要进入安全模式

    1. set SQL_SAFE_UPDATES=0;
    2. delete from TBL_USER where U_NAME='Dog';
    3. set SQL_SAFE_UPDATES=1;

    使用存储过程的方式,将语句打包在一起。DELIMITER作为定界符,随意取什么符号@@、$$都行

    1. DELIMITER @@
    2. create procedure PROC_DELETE_USER(in UNAME varchar(32))
    3. begin
    4. set SQL_SAFE_UPDATES=0;
    5. delete from TBL_USER where U_NAME=UNAME;
    6. set SQL_SAFE_UPDATES=1;
    7. end@@

    在该数据库定义好该存储过程后,以后一直都可以使用。只需要调用它就行了

    CALL PROC_DELETE_USER('Dog');
    1. #include
    2. #include
    3. #include
    4. #define KING_DB_SERVER_IP "192.168.192.128" //ip
    5. #define KING_DB_SERVER_PORT 3306 //端口号
    6. #define KING_DB_USERNAME "admin" //用户名
    7. #define KING_DB_PASSWORD "123456" //密码
    8. #define KING_DB_DEFAULTDB "KING_DB" //数据库名
    9. //SQL语句
    10. #define SQL_INSERT_TBL_USER "insert TBL_USER(U_NAME,U_GENDER) value('Lee','man');"
    11. #define SQL_SELECT_TBL_USER "select * from TBL_USER;"
    12. #define SQL_DELETE_TBL_USER "CALL PROC_DELETE_USER('Dog');"
    13. //******查询******///
    14. //第一步:要把sql语句发送给mysql服务器
    15. //第二步:把mysql服务器处理结果接受回来,并保存
    16. //第三步:接受的数据(判断多少行多少列)
    17. //第四步:抓取我们想要的数据
    18. int king_mysql_select(MYSQL* handle){
    19. //mysql_real_query--->sql
    20. if(mysql_real_query(handle,SQL_SELECT_TBL_USER,strlen(SQL_SELECT_TBL_USER))){ //(返回0为成功)
    21. printf("mysql_real_query:%s\n",mysql_error(handle));
    22. return -1;
    23. }
    24. //store 当查询语句执行完之后,数据就已经接收到了管道的数据(mysql服务器发送的),因此要存储起来
    25. MYSQL_RES *res=mysql_store_result(handle);
    26. if(res==NULL){
    27. printf("mysql_store_result:%s\n",mysql_error(handle));
    28. return -2;
    29. }
    30. //rows/fields 行/列
    31. int rows=mysql_num_rows(res);
    32. printf("rows:%d\n",rows);
    33. int fields = mysql_num_fields(res);
    34. printf("fields:%d\n",fields);
    35. //fetch
    36. MYSQL_ROW row;//定义一行的数据
    37. while(row=mysql_fetch_row(res)){
    38. for(int i=0;i
    39. printf("%s\t",row[i]);
    40. }
    41. printf("\n");
    42. }
    43. mysql_free_result(res);
    44. return 0;
    45. }
    46. //C U R D //create update read delete 传说中的:增删改查
    47. int main(){
    48. MYSQL mysql;
    49. if(!mysql_init(&mysql)){//mysql初始化并判断是否出错(返回0为失败)
    50. printf("mysql_init:%s\n",mysql_error(&mysql));//mysql_error() 函数返回上一个 MySQL 操作产生的文本错误信息
    51. return -1;
    52. }
    53. if(!mysql_real_connect(&mysql,KING_DB_SERVER_IP,KING_DB_USERNAME,KING_DB_PASSWORD,
    54. KING_DB_DEFAULTDB,KING_DB_SERVER_PORT,NULL,0)){ //连接mysql数据库,并判断是否出错(返回0为失败)
    55. printf("mysql_real_connect:%s\n",mysql_error(&mysql));
    56. return -2;
    57. }
    58. #if 0
    59. //Mysql->select
    60. king_mysql_select(&mysql);
    61. #endif
    62. #if 0
    63. //Mysql -->insert
    64. if(mysql_real_query(&mysql,SQL_INSERT_TBL_USER,strlen(SQL_INSERT_TBL_USER))){ //(返回0为成功)
    65. printf("mysql_real_query:%s\n",mysql_error(&mysql));
    66. }
    67. #endif
    68. #if 1
    69. //mysql-->delete
    70. if(mysql_real_query(&mysql,SQL_DELETE_TBL_USER,strlen(SQL_DELETE_TBL_USER))){ //(返回0为成功)
    71. printf("mysql_real_query:%s\n",mysql_error(&mysql));
    72. }
    73. #endif
    74. mysql_close(&mysql);
    75. return 0;
    76. }

  • 相关阅读:
    黄金投资面对K线图有哪些好用的交易策略?
    中石化/中石油 油卡充值接口API文档分享
    SONAR自定义检查规则插件
    so-vits-svc:AI翻唱,语音克隆
    web前端网页设计期末课程大作业:中华传统文化题材网页源码——基于HTML实现中国水墨风书画艺术网站(12个页面)
    CTF-include
    MYSQL正则表达式函数详解和实战
    【供应链】全面分析供应链类型
    C# wpf 使用ListBox实现尺子控件
    UART串口及Linux实现
  • 原文地址:https://blog.csdn.net/weixin_45767431/article/details/127946063