a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

MySQL的C語言API接口

2020-01-26 14:57:04
字體:
來源:轉載
供稿:網友

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  32int 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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 欧美日本三级 | 亚洲人免费视频 | 男女羞羞视频免费在线观看 | 老牛影视av一区二区在线观看 | 草逼逼网 | 日本a在线| 午夜成人免费影院 | 欧美精品在线视频 | 亚洲 精品 综合 精品 自拍 | 91夜夜夜| 日韩一区二区三区免费视频 | 国产在线专区 | 国产成人精品一区二区 | 日韩另类 | 成人精品在线视频 | 国产乱码精品一区二区三区忘忧草 | 国产一区二区精品 | 国产成人精品亚洲日本在线观看 | 九九国产 | 国产日韩欧美亚洲 | 国变精品美女久久久久av爽 | 国产亚洲女人久久久久毛片 | 在线色网站 | 精品无码久久久久久国产 | 中文字幕第九页 | 亚洲精品一区二区三区在线播放 | 国产精品一区二区不卡视频 | 久久久久亚洲 | 日韩欧美中文字幕在线观看 | 久久精品欧美 | 欧美亚洲另类在线 | 在线观看国产 | 成人免费一区二区三区视频网站 | 日韩成人在线播放 | 久久麻豆 | 亚洲三级在线 | 久久va | 亚洲国产一区二区在线 | 欧美6一10sex性hd | 欧美精品激情 | 亚洲精品国产综合区久久久久久久 |