分享

C语言操作MYSQL小例子

 看风景D人 2014-03-19

     初学使用用C语言操作MYSQL,写了个小例子,帖上来献丢人一下,呵呵。

     程序很简单,先连接数据库,然后向class1表中插入一条数据,最后获取并输出整个class1表的内容。


上代码:

  1. //test.c   
  2. //gcc test.c -o test -lmysqlclient   
  3. #include <stdio.h>   
  4. #include <stdlib.h>   
  5. #include <mysql/mysql.h>   
  6.   
  7. //发生错误时,输出错误信息,关闭连接,退出程序   
  8. void error_quit(const char *str, MYSQL *connection)  
  9. {  
  10.     fprintf(stderr, "%s : %d: %s\n",  
  11.         str, mysql_errno(connection),  
  12.         mysql_error(connection));  
  13.     if( connection != NULL )  
  14.         mysql_close(connection);  
  15.     exit(1);  
  16. }  
  17.   
  18. int main(int argc, char *argv[])   
  19. {  
  20.     MYSQL *my_con = malloc( sizeof(MYSQL) );  
  21.     MYSQL_RES *my_res;  
  22.     MYSQL_FIELD *my_field;  
  23.     MYSQL_ROW my_row;  
  24.     int rows, i;  
  25.     int res;  
  26.   
  27.     //连接数据库   
  28.     mysql_init(my_con);   
  29.     my_con = mysql_real_connect(my_con, "localhost""test""aaaaaaa",  
  30.         "test1", 0, NULL, CLIENT_FOUND_ROWS);  
  31.     if( NULL == my_con )   
  32.         error_quit("Connection fail", my_con);  
  33.     printf("Connection success\n");  
  34.   
  35.     //向数据库中插入一条记录   
  36.     res = mysql_query(my_con,   
  37.         "insert into class1(name, age, birthday) value('abc', 52, NOW());");  
  38.     if( res != 0 )   
  39.         error_quit("Insert fail", my_con);  
  40.     //返回的是表中被影响的行数   
  41.     res = mysql_affected_rows(my_con);  
  42.     printf("Inserted %d rows\n", res);  
  43.   
  44.     //获取整个表的内容   
  45.     res = mysql_query(my_con, "select * from class1;");  
  46.     if( res != 0 )  
  47.         error_quit("Select fail", my_con);  
  48.     my_res = mysql_store_result(my_con);  
  49.     if( NULL == my_res )  
  50.         error_quit("Get result fail", my_con);  
  51.   
  52.     //获取表的列数   
  53.     rows = mysql_num_fields(my_res);  
  54.     //获取并输出表头   
  55.     my_field = mysql_fetch_fields(my_res);  
  56.     for(i=0; i<rows; i++)  
  57.         printf("%s\t", my_field[i].name);  
  58.     printf("\n-------------------------------------\n");  
  59.   
  60.     //输出整个表的内容   
  61.     while( 1 )  
  62.     {  
  63.         my_row = mysql_fetch_row(my_res);  
  64.         if( NULL == my_row )  
  65.             break;  
  66.         for(i=0; i<rows; i++)  
  67.         {  
  68.             if( my_row[i] == NULL )  
  69.                 printf("NULL\t");  
  70.             else  
  71.                 printf("%s\t", (char*)my_row[i]);  
  72.         }  
  73.         printf("\n");  
  74.     }  
  75.   
  76.     //释放空间,关闭连接   
  77.     mysql_free_result(my_res);  
  78.     mysql_close(my_con);  
  79.     free(my_con);  
  80.   
  81.     return 0;  
  82. }  

运行结果:

  1. Connection success  
  2. Inserted 1 rows  
  3. id  name    age birthday  
  4. -------------------------------------  
  5. 49  ddd 43  2012-11-09 09:49:41  
  6. 50  fff 31  0000-00-00 00:00:00  
  7. 58  eee 32  NULL  
  8. 59  qqq 43  NULL  
  9. 78  abc 52  2012-11-13 14:47:55  

====================================

数据库中存在表table, 有name(varchar类型),age(int类型)。

  1.查询语句中引用变量值

  在执行INSERT语句时,如果对具体的值进行插入则很简单,如下向数据库表table中插入记录:name='颖',
age=32。

mysql_query(MYSQL*, "INSERT INTO table values('曹颖',32)");

  但如果插入的是变量的值,如数据是用户输入的,这些数据保存在变量中。与在java中插入变量值的方式完全不同,C语句则要使用如下方式实现:

  假如用户输入的姓名和年龄值分别保存在变量name,age中

char sql_insert[200];

sprintf(sql_insert, "INSERT INTO table values('%s','%d');", name, age);

mysql_query(&mysql_conn, sql_insert);


  上述语句在执行完sprintf语句后,sql_insert中保存的是INSERT查询语句字符串,sql_insert作为mysql_query()语句的参数即可实现正确的插入。

  这里例举的是 INSERT 语句,当然,对其它操作语句如SELECT,UPDATE,DELETE等亦如此。


  2.如果提取查询结果值

  同样我们查询table表中的所有字段,实现语句如下:

MYSQL_RES *res_ptr;
MYSQL_ROW row;

mysql_query(&mysql_conn, select_sql);
res_ptr = mysql_store_result(&mysql_conn);
while ((row = mysql_fetch_row(res_ptr)))
{
printf("%s %s\n", row[0], row[1]);
}

  注意:row[0]中是姓名 -- 是字符串; 而row[1]字段是年龄,应该是int类型,但事实上row[1]的值也是一字符串,所以在获得数据库中记录的字段时,所有的字段均转换为字符串形式提取,所以在打印row[1]时格式段用的是%s,而不是%d 。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多