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_queryint stdcall mysql_query(mysql *mysql, const char *q);
第乙個引數上面已經介紹過,第二個引數為要執行的sql語句。
這個函式總體就兩步:
(1)傳送sql語句,其實就乙個socket傳送sql 語句,加上mysql固定的協議頭。懶的去看原始碼了,抓了下包,如下:
紅色部分是協議,前面兩位其實就是包的長度。具體協議沒研究過。
(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官方**: 突然發現官方**資料好全面,貌似比任何書都要好。
下面來個例子:
#include
#include
#include
#include
#define max_column_len 32
int main(int argc , char *ar**)
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");
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
printf("%s\t",column[i]);
printf("\n");
while(sql_row=mysql_fetch_row(result))//獲取具體的資料
for(i=0;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);//斷開連線
gcc具體的編譯方法:gcc ***.c -o *** -lmysqlclient
c語言和c 的「 」的語言
在c語言中,有三種作用,分別如下 1.取位址。單目運算子。用來取乙個變數的位址。比如int i,p p i 這裡的 作用是取變數i的位址。int a 1 int p a 取位址給位址變數,所以這個是取位址 引用 int a 1 int p a 取乙個變數的別名,我們可以通過這個變數賦值給標有 符號的...
的c語言 C語言的歷史,個人談談c語言
c語言的設計目標就是提供一種簡單的方式,編譯處理低階儲存器,產生少量的機器碼,來完成程式設計。20世紀80年代,美國國家標準局為了避免各國產生的差異,於是給c語言制定了一套完整的國際標準語言,它的名稱是ansic,2011年12月8日,國際標準化組織發布ce標準,也就是c語言的新標準。20世紀60年...
c 語言與C語言的區別
c 之類的語言是物件導向的。使用這樣的語言程式設計被稱為物件導向程式設計 object oriented programming,oop。它可以讓計算機程式設計師將乙個物件導向的設計實現稱為乙個可工作的軟體系統 c之類的語言是過程性 procedural 所以程式設計總是面向動作的。在c語言中,程式...