本帖最后由 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循环,每循环一次就打印一行,执行结束后,所有的查询结果就都被打印出来了。 |