mysql介面教程 MySQL的C語言API介面

2021-10-18 22:25:40 字數 2758 閱讀 3732

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

mysql教程 mysql事務與mysql儲存引擎

事務概念及儲存引擎 1.0為何要事務?先來看乙個場景,銀行轉賬匯款 李彥巨集和周鴻?天天打架,現在讓李彥巨集給周鴻?轉款1000元 設計如下表 account表 編號 id 使用者名稱 user 金額 cash 1 李彥巨集 3000 2 周鴻?2000 傳統的做法 mysql update acc...

mysql用法教程 Mysql使用簡單教程 二

字段引數以 欄位名1 資料型別1,欄位名2 資料型別2,的形式構建。關於mysql常用的資料型別,一下是比較常用的幾種,想查閱比較詳細的資料可以自尋去網上搜尋。型別 說明 char 1 255個字元的定長串,它的長度必須在建立時指定,否則mysql假定為char 1 varchar 可變長度,最多不...

mysql教程 知乎 MySQL教程(三)

mysql update語句簡介 我們使用update語句來更新表中的現有資料。也可以使用update語句來更改表中單個行,一組行或所有行的列值。下面說明了mysql update語句的語法 update low priority ignore table name setcolumn name1 ...