MySQL的C說話API接口。本站提示廣大學習愛好者:(MySQL的C說話API接口)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL的C說話API接口正文
1、起首固然是銜接數據庫,函數原型以下:
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag);
第一個參數 MYSQL是 C api中一個異常主要的變量,外面內存異常豐碩,有port,dbname,charset等銜接根本參數。它也包括了一個叫 st_mysql_methods的構造體變量,該變量外面保留著許多函數指針,這些函數指針將會在數據庫銜接勝利今後的各類數據操作中被挪用。mysql_real_connect函數中各參數,根本都是顧名思意。
2、銜接數據庫勝利以後便可以履行sql語句了應用mysql_query
int STDCALL mysql_query(MYSQL *mysql, const char *q);
第一個參數下面曾經引見過,第二個參數為要履行的sql語句。
這個函數整體就兩步:
(1)發送sql語句,其實就一個socket發送sql 語句,加上mysql固定的協定頭。懶的去看源碼了,抓了下包,以下:
0000 19 00 00 00 0373 65 6c 65 63 74 20 61 70 70 5f .....select app_
0010 6e 61 6d 65 20 66 72 6f 6d 20 61 70 70 name from app
白色部門是協定,後面兩位其實就是包的長度。詳細協定沒研討過。
(2)然後就是接收成果,這裡將會挪用MYSQL變量中的st_mysql_methods中的read_query_result函數指針
3、獲得成果
sql履行完今後,假如是查詢語句,我們固然還要讀取數據,假如update,insert等語句,那末就看下操作勝利與否便可。我們來看看若何獲得查詢成果: 假如mysql_query前往勝利,那末我們就經由過程mysql_store_result這個函數來讀取成果。原型以下:
MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
該函數會挪用MYSQL變量中的st_mysql_methods中的 read_rows函數指針來獲得查詢的成果。同時該函數會前往MYSQL_RES 如許一個變量,該變量重要用於保留查詢的成果。同時該函數malloc了一片內存空間來存儲查詢過去的數據,所以我們必定要記的 free(result),否則是確定會形成內存洩露的。 履行完mysql_store_result今後,其實數據都曾經在MYSQL_RES 變量中了,上面的api根本就是讀取MYSQL_RES 中的數據。例如mysql_fetch_row這個函數,就是讀去查詢成果的一行。函數原型以下
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
它會前往一個MYSQL_ROW變量,MYSQL_ROW其實就是char **.就當做一個二維數組來用吧。還有許多api,不再逐個引見,年夜部門信息都在MYSQL_RES MYSQL這兩個構造體中。詳細可以參考mysql官方網站: http://dev.mysql.com/doc/refman/5.1/en/c.html 忽然發明官方網站材料好周全,貌似比任何書都要好。
上面來個例子:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<mysql/mysql.h> #define MAX_COLUMN_LEN 32 int main(int argc , char *argv[]) { MYSQL my_connection; MYSQL_RES *result; MYSQL_ROW sql_row; MYSQL_FIELD *fd; char column[MAX_COLUMN_LEN][MAX_COLUMN_LEN]; int res; mysql_init(&my_connection); if(mysql_real_connect(&my_connection,"127.0.0.1","用戶","暗碼","數據稱號",3306,NULL,0)) { perror("connect"); res=mysql_query(&my_connection,"select * from app");//查詢 if(!res) { result=mysql_store_result(&my_connection);//保留查詢到的數據到result if(result) { int i,j; printf("the result number is %lu\n ",(unsigned long)mysql_num_rows(result)); for(i=0;fd=mysql_fetch_field(result);i++)//獲得列名 { bzero(column[i],sizeof(column[i])); strcpy(column[i],fd->name); } j=mysql_num_fields(result); for(i=0;i<j;i++) { printf("%s\t",column[i]); } printf("\n"); while(sql_row=mysql_fetch_row(result))//獲得詳細的數據 { for(i=0;i<j;i++) { printf("%s\t",sql_row[i]); } printf("\n"); } } } else { perror("select"); } } else { perror("connect:error"); } mysql_free_result(MYSQL_RES *result);//釋放成果資本 mysql_close(&my_connection);//斷開銜接 }
下面這個例子就是從一個表中查數據,然後輸入。 假如要insert或許update,只須要修正詳細的sql既可。詳細的操作都是經由過程mysql_query這個函數來弄定。 如今來說編譯的辦法吧,這裡我們須要.h和.so庫。我們可以在 http://dev.mysql.com/downloads/connector/c/6.0.html 下載Connector/C。簡略的辦法就是: 把外面include的器械拷貝到/usr/include/mysql/上面去,如許編譯的時刻就不須要加-I了,然後把lib上面的器械拷貝的/usr/lib/下去。
gcc詳細的編譯辦法:gcc ***.c -o *** -lmysqlclient