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 ...