免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1782 | 回复: 1
打印 上一主题 下一主题

【分享】一个调用mysql的程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-01 13:16 |只看该作者 |倒序浏览
本帖最后由 chinafenghao 于 2013-03-04 08:58 编辑

一个调用mysql的程序
一个用到mysql的程序,用以学习mysql函数,程序如下所示:
/*********************************************************
*           get_out_mysql.c
*
*  Mon Sep 18 16:57:49 2006
* Copyright  2006  Spark Zheng
*********************************************************/
#include< stdio.h>
#include< stdlib.h>
#include< ctype.h>
#include< strings.h>
#include< unistd.h>
#include< syslog.h>
//#include< mysql/mysql.h>
#include "/usr/include/mysql/mysql.h"
#define HOST "localhost"
#define USER "root"
#define PASSWORD "chenjie"
#define DATABASE "post1"
void mysql_handle();
void mysql_exit();
MYSQL mysql;
int main(int argc,char **argv)
{
  if(mysql_init(&mysql)== NULL)//初始化mysql结构,具体有什么作用现在还不懂
  {
           syslog(LOG_USER|LOG_INFO,"初始化MYSQL出错.\n");//syslog是向系统日志中写东西
             exit(1);
            
}
   
    if (!mysql_real_connect(&mysql,HOST,USER,PASSWORD,DATABASE,0,NULL,0))//连接数据库
   {
                printf(/*iLOG_USER|LOG_INFO, */"打开数据库出错: %s\n",
                       mysql_error(&mysql));
          exit(1);
    }
   else
        {
          printf(/*syslog(LOG_USER|LOG_INFO,*/ "连接上数据库,等待操作:\n");
      }
   
    mysql_handle();
     
    mysql_exit();
      
    return 0;
}
void mysql_exit()
{
        mysql_close(&mysql);
}
void mysql_handle()
{
       MYSQL_RES *m_res;
   MYSQL_ROW m_row;
    MYSQL_FIELD *m_fd;
//        char *sort_dbname = "";
//   char *sort_name = "";
       char *mesg_dbname ="test";// 数据库post1中的一个表
     char *mesg_name ="*";// 和上面一句都是为了下面的sql语句服务的
   char *sel_statement;
        int row_num = 0;
        sel_statement = (char*)malloc(75*sizeof(char));
     
    sprintf(sel_statement,"select %s from %s",mesg_name,mesg_dbname);//将第二个参数中的值格式化输入第一个参数,
   printf("%s.\n",sel_statement);
//  printf("jiu zai zhe li\n");  
   if(mysql_real_query(&mysql,sel_statement,(unsigned int)strlen(sel_statement)) != 0)//执行sql语句
     {
         printf(/*  syslog(LOG_USER|LOG_INFO,*/"Mysql查询出错:%s\n",
           mysql_error(&mysql));
             exit(2);
    }
   
    if((m_res = mysql_store_result(&mysql)) == NULL)//sql语句的查询结果保存到一个mysql_res结构中
        {
        printf(/*   syslog(LOG_USER|LOG_INFO,*/"Mysql获取出错:%s\n",
           mysql_error(&mysql));
             exit(2);
    }
       row_num = mysql_num_rows(m_res);//查看结果集合中的行数
    printf("Now fetch %d rows \n",row_num);
int j=0;
while( m_fd = mysql_fetch_field(m_res) )//返回作为一个MYSQL_FIELD结构的一个结果集合的一个列的定义
    {
          printf("%s\t",m_fd->name);
          j++;
       }
   printf("\n");
   int i = 0;
  while((m_row = mysql_fetch_row(m_res)))//检索一个结果集合的下一行
     {
           i=0;
               while(i<j)//j的数值是该表的列数
               {
                  printf("%s\t",m_row);//执行这个循环就可以将表中的这一行全部打印出来
                    i++;
                }
           printf("over one \n");
      }
       if (mysql_errno(&mysql))
        {
       printf(/*    syslog(LOG_USER|LOG_INFO,*/"Mysql出错:%s\n",mysql_error(&mysql));
         exit(2);
    }
       mysql_free_result(m_res);//释放由mysql_store_result()mysql_use_result()等为一个结果集合分配的内存
       free(sel_statement);//释放malloc函数分配的内存
}
源文件就在此文件夹中,可以试运行。
其中,我用mysql建了个数据库,名为post1,其中只有一个表test,另外,mysql的用户名和密码分别是:“root”、“chenjie”,此程序的功能就是读取数据库post1中的表test的内容,并将其打印出来。
以下详述此程序在gdb中显示的每一步的输出。
①处为初始化一个mysql结构,一般来说,这个结构包含了有关mysql的各种信息,具体功能现在还不了解。
②处即连接数据库。
③处即将前面导入sel_statement的那句sql语句执行,此处即为查询数据库post1中的表test的内容。
④处即将查询的结果保存到一个mysql_res的结构中,这个结构中也有很多量,现在其究竟为什么意思,还是不太明白。
⑤处每调用一次(即while)每循环一次都返回结果集合中的一个列的定义,将其保存在一个mysql_fd的结构中,这个结构中包含很多量,将这一列的所有信息全部包含了,再次调用就返回下一列的信息,直到所有列的信息全部返回完后,最后一次返回NULL,此时while循环结束。在mysql参考手册中,这个函数是这样介绍的:“返回作为一个MYSQL_FIELD结构的一个结果集合的一个列的定义。重复调用这个函数在结果集合中检索所有关于列的信息。当没有剩下更多的字段时,mysql_fetch_field()返回NULL。”但是,每调用一次,mysql_fd结构中的数据就被改变了,所以要调用一次,打印一次,同时,调用多少次,就说明test表中有多少个列,这里设定一个j也就是这个作用,作为下面的while循环的循环次数。
⑥处的mysql_fetch_row(m_res)函数在mysql手册中的介绍是:“检索一个结果集合的下一行。当在mysql_store_result()之后使用时,如果没有更多的行可见所时,mysql_fetch_row()返回NULL。”它执行一次,就检索到了查询结果集合的一行,而其内层的while循环,每次打印一个值,循环j次,就能够将这一行打印完,执行外层while循环,每循环一次就打印一行,执行结束后,所有的查询结果就都被打印出来了。
查看原文:原文链接

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52戌狗
日期:2013-12-27 15:08:11
2 [报告]
发表于 2013-03-01 13:45 |只看该作者
描述的太多了 简单点问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP