本帖最后由 chinafenghao 于 2013-03-04 08:58 編輯
一個調(diào)用mysql的程序 一個用到mysql的程序,用以學(xué)習(xí)mysql函數(shù),程序如下所示: /********************************************************* * 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結(jié)構(gòu),具體有什么作用現(xiàn)在還不懂① { syslog(LOG_USER|LOG_INFO,"初始化MYSQL出錯.\n");//syslog是向系統(tǒng)日志中寫東西 exit(1); } if (!mysql_real_connect(&mysql,HOST,USER,PASSWORD,DATABASE,0,NULL,0))//連接數(shù)據(jù)庫② { printf(/*iLOG_USER|LOG_INFO, */"打開數(shù)據(jù)庫出錯: %s\n", mysql_error(&mysql)); exit(1); } else { printf(/*syslog(LOG_USER|LOG_INFO,*/ "連接上數(shù)據(jù)庫,等待操作:\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";// 數(shù)據(jù)庫post1中的一個表 char *mesg_name ="*";// 和上面一句都是為了下面的sql語句服務(wù)的 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);//將第二個參數(shù)中的值格式化輸入第一個參數(shù), printf("%s.\n",sel_statement); // printf("jiu zai zhe li\n"); if(mysql_real_query(&mysql,sel_statement,(unsigned int)strlen(sel_statement)) != 0)//執(zhí)行sql語句③ { printf(/* syslog(LOG_USER|LOG_INFO,*/"Mysql查詢出錯:%s\n", mysql_error(&mysql)); exit(2); } if((m_res = mysql_store_result(&mysql)) == NULL)//將sql語句的查詢結(jié)果保存到一個mysql_res結(jié)構(gòu)中④ { printf(/* syslog(LOG_USER|LOG_INFO,*/"Mysql獲取出錯:%s\n", mysql_error(&mysql)); exit(2); } row_num = mysql_num_rows(m_res);//查看結(jié)果集合中的行數(shù) printf("Now fetch %d rows \n",row_num); int j=0; while( m_fd = mysql_fetch_field(m_res) )//返回作為一個MYSQL_FIELD結(jié)構(gòu)的一個結(jié)果集合的一個列的定義⑤ { printf("%s\t",m_fd->name); j++; } printf("\n"); int i = 0; while((m_row = mysql_fetch_row(m_res)))//檢索一個結(jié)果集合的下一行⑥ { i=0; while(i<j)//j的數(shù)值是該表的列數(shù) { printf("%s\t",m_row);//執(zhí)行這個循環(huán)就可以將表中的這一行全部打印出來 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()等為一個結(jié)果集合分配的內(nèi)存 free(sel_statement);//釋放malloc函數(shù)分配的內(nèi)存 } 源文件就在此文件夾中,可以試運行。 其中,我用mysql建了個數(shù)據(jù)庫,名為post1,其中只有一個表test,另外,mysql的用戶名和密碼分別是:“root”、“chenjie”,此程序的功能就是讀取數(shù)據(jù)庫post1中的表test的內(nèi)容,并將其打印出來。 以下詳述此程序在gdb中顯示的每一步的輸出。 ①處為初始化一個mysql結(jié)構(gòu),一般來說,這個結(jié)構(gòu)包含了有關(guān)mysql的各種信息,具體功能現(xiàn)在還不了解。 ②處即連接數(shù)據(jù)庫。 ③處即將前面導(dǎo)入sel_statement的那句sql語句執(zhí)行,此處即為查詢數(shù)據(jù)庫post1中的表test的內(nèi)容。 ④處即將查詢的結(jié)果保存到一個mysql_res的結(jié)構(gòu)中,這個結(jié)構(gòu)中也有很多量,現(xiàn)在其究竟為什么意思,還是不太明白。 ⑤處每調(diào)用一次(即while)每循環(huán)一次都返回結(jié)果集合中的一個列的定義,將其保存在一個mysql_fd的結(jié)構(gòu)中,這個結(jié)構(gòu)中包含很多量,將這一列的所有信息全部包含了,再次調(diào)用就返回下一列的信息,直到所有列的信息全部返回完后,最后一次返回NULL,此時while循環(huán)結(jié)束。在mysql參考手冊中,這個函數(shù)是這樣介紹的:“返回作為一個MYSQL_FIELD結(jié)構(gòu)的一個結(jié)果集合的一個列的定義。重復(fù)調(diào)用這個函數(shù)在結(jié)果集合中檢索所有關(guān)于列的信息。當(dāng)沒有剩下更多的字段時,mysql_fetch_field()返回NULL!钡牵空{(diào)用一次,mysql_fd結(jié)構(gòu)中的數(shù)據(jù)就被改變了,所以要調(diào)用一次,打印一次,同時,調(diào)用多少次,就說明test表中有多少個列,這里設(shè)定一個j也就是這個作用,作為下面的while循環(huán)的循環(huán)次數(shù)。 ⑥處的mysql_fetch_row(m_res)函數(shù)在mysql手冊中的介紹是:“檢索一個結(jié)果集合的下一行。當(dāng)在mysql_store_result()之后使用時,如果沒有更多的行可見所時,mysql_fetch_row()返回NULL。”它執(zhí)行一次,就檢索到了查詢結(jié)果集合的一行,而其內(nèi)層的while循環(huán),每次打印一個值,循環(huán)j次,就能夠?qū)⑦@一行打印完,執(zhí)行外層while循環(huán),每循環(huán)一次就打印一行,執(zhí)行結(jié)束后,所有的查詢結(jié)果就都被打印出來了。 |