mysql基础:mysql与C结合实例

2023-09-17 14:24

mysql基础:mysql与C结合实例

http://www.nigeriaembassy.cn/jk110333/article/details/9371263

一个简单的mysql与C的交互,使用了一些mysql的C API!

老鸟掠过,新手可以看看!


[cpp] view plain copy
  1. /****************************************** 
  2.   本文件学习mysql的database使用 
  3.   学习mysql的C接口 
  4.   包括初始化db,检查数据库是否存在,不存在就创建。 
  5.   检查表是否存在,不存在则创建 
  6.  *****************************************/  
  7. #include   
  8. #include   
  9. #include   
  10.   
  11. //需要包含mysql的头文件,/usr/include/mysql/  
  12. //编译的时候需要加上-L/usr/lib/ -lmysqlclient -I/usr/include/mysql选项  
  13.   
  14. #include  //基本的头文件,一些重要结构体的声明  
  15. #include //错误信息的存放  
  16. #include   //包含当前mysql的版本信息  
  17. //全部变量,宏定义//  
  18. #define DEBUG  
  19. #define SERVER_HOST "localhost"  //mysql的远程地址  
  20. #define SERVER_USER "root"      //数据库登录名  
  21. #define SERVER_PWD  "123"  //数据库登录密码  
  22.   
  23. #define DB_NAME     "tmp_db"    //新建数据库的名字  
  24. #define TABLE_NAME  "mytables"  //库中的表  
  25.   
  26. int check_tbl(MYSQL* mysql,char *name);  
  27. int check_db(MYSQL *mysql,char *db_name);  
  28.   
  29. int init_db()  
  30. {  
  31.   
  32.     int err=0;  
  33.     MYSQL mysql;  
  34.   
  35.     if(!mysql_init(&mysql)){  
  36.         perror("mysql_init:");  
  37.         exit(1);  
  38.     }     
  39.   
  40.     if(!mysql_real_connect(&mysql,SERVER_HOST,SERVER_USER,SERVER_PWD,NULL,0,NULL,0))  
  41.     {     
  42.         perror("mysql_real_connect");  
  43.         exit(1);  
  44.     }     
  45.     printf("connected.....\n");  
  46.   
  47.     err = check_db(&mysql,DB_NAME);  
  48.     if(err != 0)  
  49.     {     
  50.         printf("create db is err!\n");  
  51.         mysql_close(&mysql);  
  52.         exit(1);  
  53.     }     
  54.     //select which db  
  55.         if(mysql_select_db(&mysql,DB_NAME)) //return 0 is success ,!0 is err  
  56.     {  
  57.         perror("mysql_select_db:");  
  58.         mysql_close(&mysql);  
  59.         exit(1);  
  60.     }  
  61.     //chuangjianbiao  
  62.     if((err=check_tbl(&mysql,TABLE_NAME))!=0)  
  63.     {  
  64.         printf("check_tbl is err!\n");  
  65.         mysql_close(&mysql);  
  66.         exit(1);  
  67.     }  
  68.     mysql_close(&mysql);  
  69.     return 0;  
  70. }  
  71.   
  72. int check_db(MYSQL *mysql,char *db_name)  
  73. {  
  74.     MYSQL_ROW row = NULL;  
  75.     MYSQL_RES *res = NULL;  
  76.   
  77.     res = mysql_list_dbs(mysql,NULL);  
  78.     if(res)  
  79.     {  
  80.         while((row = mysql_fetch_row(res))!=NULL)  
  81.         {  
  82.             printf("db is %s\n",row[0]);  
  83.             if(strcmp(row[0],db_name)==0)  
  84.             {  
  85.                 printf("find db %s\n",db_name);  
  86.                 break;  
  87.             }  
  88.         }  
  89.         //mysql_list_dbs会分配内存,需要使用mysql_free_result释放  
  90.         mysql_free_result(res);  
  91.     }  
  92.     if(!row)  //没有这个数据库,则建立  
  93.     {  
  94.         char buf[128]={0};  
  95.         strcpy(buf,"CREATE DATABASE ");  
  96.         strcat(buf,db_name);  
  97. #ifdef DEBUG  
  98.         printf("%s\n",buf);  
  99. #endif  
  100.         if(mysql_query(mysql,buf)){  
  101.             fprintf(stderr,"Query failed (%s)\n",mysql_error(mysql));  
  102.             exit(1);  
  103.         }  
  104.     }  
  105.     return 0;  
  106. }  
  107.   
  108. int check_tbl(MYSQL* mysql,char *name)  
  109. {  
  110.     if(name == NULL)  
  111.         return 0;  
  112.     MYSQL_ROW row=NULL;  
  113.     MYSQL_RES *res = NULL;  
  114.     res = mysql_list_tables(mysql,NULL);  
  115.     if(res)  
  116.     {  
  117.         while((row = mysql_fetch_row(res))!=NULL)  
  118.         {  
  119.             printf("tables is %s\n",row[0]);  
  120.             if(strcmp(row[0],name) == 0)  
  121.             {  
  122.                 printf("find the table !\n");  
  123.                 break;  
  124.             }  
  125.         }  
  126.         mysql_free_result(res);  
  127.     }  
  128.     if(!row) //create table  
  129.     {  
  130.         char buf[128]={0};  
  131.         char qbuf[128]={0};  
  132.         snprintf(buf,sizeof(buf),"%s (name VARCHAR(20),sex char(1),score int(3));",TABLE_NAME);  
  133.         strcpy(qbuf,"CREATE TABLE ");  
  134.         strcat(qbuf,buf);  
  135. //#ifdef DEBUG  
  136.         printf("%s\n",qbuf);  
  137. //#endif  
  138.         if(mysql_query(mysql,qbuf)){  
  139.             fprintf(stderr,"Query failed (%s)\n",mysql_error(mysql));  
  140.             exit(1);  
  141.         }  
  142.     }  
  143.     return 0;  
  144. }  
  145.   
  146. int main()  
  147. {  
  148.     int err=0;  
  149.     err = init_db();  
  150.   
  151.     return 0;  
  152. }  

编译的方法:最后的-I一定要注意检查这个目录是不是存在,否则会报错

[sql] view plain copy
  1. gcc -o mysql mysql.c -L/usr/lib/ -lmysqlclient -I/usr/include/mysql  

报错:

[python] view plain copy
  1. root@jack-desktop:~# gcc -o mysql mysql.c -L/usr/lib/ -lmysqlclient  
  2. gcc: mysql.c: 没有那个文件或目录  
  3. root@jack-desktop:~  
  4. root@jack-desktop:~  
  5. root@jack-desktop:~# cd myc/  
  6. root@jack-desktop:myc# gcc -o mysql mysql.c -L/usr/lib/ -lmysqlclient  
  7. mysql.c:15:73: error: mysql.h: 没有那个文件或目录  
  8. mysql.c:16:43: error: errmsg.h: 没有那个文件或目录  
  9. mysql.c:17:63: error: mysql_version.h: 没有那个文件或目录  
  10. mysql.c:27: error: expected ‘)’ before ‘*’ token  
  11. mysql.c:28: error: expected ‘)’ before ‘*’ token  
  12. mysql.c: In function ‘init_db’:  
  13. mysql.c:34: error: ‘MYSQL’ undeclared (first use in this function)  
  14. mysql.c:34: error: (Each undeclared identifier is reported only once  
  15. mysql.c:34: error: for each function it appears in.)  
  16. mysql.c:34: error: expected ‘;’ before ‘mysql’  
  17. mysql.c:36: error: ‘mysql’ undeclared (first use in this function)  
  18. mysql.c: At top level:  
  19. mysql.c:73: error: expected ‘)’ before ‘*’ token  
  20. mysql.c:109: error: expected ‘)’ before ‘*’ token