日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql c api example_The MySQL C API 编程实例

發(fā)布時間:2025/3/15 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql c api example_The MySQL C API 编程实例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在網(wǎng)上找了一些MYSQL C API編程的文章,看了后認(rèn)為還是寫的不夠充分,依據(jù)自己經(jīng)驗寫了這篇《The MySQL C API 編程實例》,希望對須要調(diào)用到MYSQL的C的API的朋友有所幫助,附例中的環(huán)境為RedHat

在這篇文章里,我們將學(xué)會怎么使用MySQL 的C APIs(Application Programming Interfaces 編程接口)。為了非常好地了解這篇文章,您須要具備下面前提知識:

C語言變量

C語言函數(shù)

C語言指針

簡單介紹

C APIs包括在mysqlclient庫文件其中與MySQL的源碼一塊發(fā)行,用于連接到數(shù)據(jù)庫和運行數(shù)據(jù)庫查詢。有一些樣例在MySQL原代碼的clients文件夾里。

MySQL C 變量類型

下面變量類型在MySQL的庫其中定義。我們須要這些變量是為了使用MySQL的函數(shù)。這些變量有具體的解釋,可是這些解釋對于寫代碼來說并不重要。

MYSQL

下面代碼塊是用來連接數(shù)據(jù)庫的通訊過程,要連接MYSQL,必須建立MYSQL實例,通過mysql_init初始化方能開始進行連接,這個在后面會講到。

typedef struct st_mysql {NETnet;/* Communication parameters */gptrconnector_fd;/* ConnectorFd for SSL */char*host,*user,*passwd,*unix_socket,*server_version,*host_info,*info,*db;unsigned intport,client_flag,server_capabilities;unsigned intprotocol_version;unsigned intfield_count;unsigned intserver_status;unsigned long thread_id;/* Id for connection in server */my_ulonglong affected_rows;my_ulonglong insert_id;/* id if insert on table with NEXTNR */my_ulonglong extra_info;/* Used by mysqlshow */unsigned long packet_length;enum mysql_status status;MYSQL_FIELD*fields;MEM_ROOTfield_alloc;my_boolfree_me;/* If free in mysql_close */my_boolreconnect;/* set to 1 if automatic reconnect */struct st_mysql_options options;charscramble_buff[9];struct charset_info_st *charset;unsigned intserver_language;} MYSQL;

MYSQL_RES

這個結(jié)構(gòu)代表返回行的一個查詢的(SELECT, SHOW, DESCRIBE, EXPLAIN)的結(jié)果。返回的數(shù)據(jù)稱為“數(shù)據(jù)集”,用過數(shù)據(jù)庫的朋友應(yīng)該對數(shù)據(jù)庫中查詢后得到的結(jié)果集不會陌生,在C的API里相應(yīng)的就是MYSQL_RES了,從數(shù)據(jù)庫讀取數(shù)據(jù),最后就是從MYSQL_RES中讀取數(shù)據(jù)。

typedef struct st_mysql_res {my_ulonglong row_count;unsigned intfield_count, current_field;MYSQL_FIELD*fields;MYSQL_DATA*data;MYSQL_ROWS*data_cursor;MEM_ROOTfield_alloc;MYSQL_ROWrow;/* If unbuffered read */MYSQL_ROWcurrent_row;/* buffer to current row */unsigned long *lengths;/* column lengths of current row */MYSQL*handle;/* for unbuffered reads */my_booleof;/* Used my mysql_fetch_row */} MYSQL_RES;

MYSQL_ROW

這是一個行數(shù)據(jù)的類型安全(type-safe)的表示。當(dāng)前它實現(xiàn)為一個計數(shù)字節(jié)的字符串?dāng)?shù)組。(假設(shè)字段值可能包括二進制數(shù)據(jù),你不能將這些視為空終止串,由于這種值能夠在內(nèi)部包括空字節(jié)) 行通過調(diào)用mysql_fetch_row()獲得。

typedef char **MYSQL_ROW;

MYSQL_FIELD

這個結(jié)構(gòu)包括字段信息,比如字段名、類型和大小。其成員在以下更具體地描寫敘述。你能夠通過反復(fù)調(diào)用mysql_fetch_field()對每一列獲得MYSQL_FIELD結(jié)構(gòu)。字段值不是這個結(jié)構(gòu)的部分;他們被包括在一個MYSQL_ROW結(jié)構(gòu)中。

typedef struct st_mysql_field {char *name;/* Name of column */char *table;/* Table of column if column was a field */char *def;/* Default value (set by mysql_list_fields) */enum enum_field_types type;/* Type of field. Se mysql_com.h for types */unsigned int length;/* Width of column */unsigned int max_length;/* Max width of selected set */unsigned int flags;/* Div flags */unsigned int decimals;/* Number of decimals in field */} MYSQL_FIELD;

my_ulonglong

typedef unsigned long my_ulonglong;

該類型用于行編號和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。這種類型提供0到1.84e19的一個范圍。在一些系統(tǒng)上,試圖打印類型my_ulonglong的值將不工作。為了打印出這種值,將它變換到unsigned long而且使用一個%lu打印格式。比如:

printf (Number of rows: %lu/n", (unsigned long) mysql_num_rows(result));

連接MySQL,查詢數(shù)據(jù)

如今如果MySQL已安裝,用戶和數(shù)據(jù)表在數(shù)據(jù)庫被創(chuàng)造。以防有什么不明問題的情況,請參考站點。

前面已經(jīng)說過,MySQL的庫文件在mysqlclient。因此在編譯MySQL程序的時候有必要加上-lmysqlclient編譯選項。MySQL的頭文件在/usr/include/mysql文件夾下(依據(jù)Linux的發(fā)行版本號的不同,這個文件夾也有所不同),因此你的程序頭部看起來有點這個樣子:

#include

MySQL的變量類型和函數(shù)都包括在這個頭文件其中

然后,我們須要創(chuàng)建連接數(shù)據(jù)庫的變量,能夠簡單地這么做:

MYSQL mysql;

在連接數(shù)據(jù)庫之前,我們要調(diào)用下面函數(shù)初始化這個變量:

mysql_init(&mysql);

然后,調(diào)用mysql_real_connect函數(shù):

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 int clientflag);

該函數(shù)被調(diào)用連接到數(shù)據(jù)庫。host是MySQLserver的主機名,user是登錄的username,passwd是登錄password,db是要連接的數(shù)據(jù)庫,port是MySQLserver的TCP/IP端口,unix_socket是連接類型,clientflag是MySQL執(zhí)行成ODBC數(shù)據(jù)庫的標(biāo)記。在這篇文章其中該標(biāo)記設(shè)成0,連接尋建立后,這個函數(shù)返回0。

如今能夠連接數(shù)據(jù)庫,進行查詢了:

char *query;

使用這個字符串我們能夠創(chuàng)立不論什么SQL查詢語句進行查詢。運行這個查詢的函數(shù)是:

int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned int length);

mysql是我們前面用過的變量,q是SQL查詢語句,length是這個查詢語句的長度。假設(shè)查詢成功,函數(shù)返回0。

查詢之后,我們要到一個MYSQL_RES變量來使用查詢的結(jié)果。下面這行創(chuàng)立這個變量:

MYSQL_RES *res;

然后

res = mysql_store_result(&mysql);

對client而言,有兩種方法處理結(jié)果集合。一種方法是通過調(diào)用mysql_store_result()立馬檢索所有結(jié)果。該函數(shù)從server獲得查詢返回的所有行,并將他們存儲在client。另外一種方法是對客戶通過調(diào)用mysql_use_result()初始化一個一行一行地結(jié)果集合的檢索。該函數(shù)初始化檢索,可是實際上不從server獲得不論什么行。

在兩種情況中,你通過mysql_fetch_row()存取行。用mysql_store_result()、mysql_fetch_row()儲存取已經(jīng)從server被取出的行。用mysql_use_result()、mysql_fetch_row()實際上從server檢索行。調(diào)用mysql_fetch_lengths()可獲得關(guān)于每行中數(shù)據(jù)值尺寸的信息。

在你用完一個結(jié)果集合以后,調(diào)用mysql_free_result()釋放由它使用的內(nèi)存。

兩種檢索機制是互補的。客戶程序應(yīng)該選擇最適合他們的要求的途徑。在實踐中,客戶通常更愿意使用mysql_store_result()。

該函數(shù)讀出查詢結(jié)果。

雖然能夠非常easy地查詢了,要用這個查詢的結(jié)果還要用到其他的函數(shù)。第一個是:

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

該函數(shù)把結(jié)果轉(zhuǎn)換成“數(shù)組”。你可能注意到了,該函數(shù)返回的是MYSQL_ROW變量類型。下面語句創(chuàng)立那樣的變量:

MYSQL_ROW row = mysql_fetch_row(res)

如前所解釋的,變量row是一個字符串?dāng)?shù)組。也就是說,row[0]是數(shù)組的第一個值,row[1]是數(shù)組的第二個值...當(dāng)我們用mysql_fetch_row的時候,接著變量row會取得結(jié)果的下一組的數(shù)據(jù)。當(dāng)?shù)搅私Y(jié)果的尾部,該函數(shù)返回一負(fù)值。

使用數(shù)據(jù)集結(jié)束后,記得釋放數(shù)據(jù)集,否則會發(fā)生內(nèi)存泄漏,釋放數(shù)據(jù)集函數(shù)例如以下:

void mysql_free_result(MYSQL_RES *result)

釋放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等為一個結(jié)果集合分配的內(nèi)存。當(dāng)你用完了一個結(jié)果集合時,你必須調(diào)用mysql_free_result()來釋放它使用的內(nèi)存。

最后我們要關(guān)閉這個連接:

mysql_close(&mysql);

樣例程序

運行一個select操作,從數(shù)據(jù)庫中取數(shù)據(jù),并運行一個insert操作,往數(shù)據(jù)庫中插入數(shù)據(jù),依據(jù)這兩個操作你能夠自由的擴展為隨意數(shù)據(jù)庫操作,

準(zhǔn)備條件

1、已經(jīng)安裝mysql,上有數(shù)據(jù)庫test,假設(shè)沒有運行

Create Databse test

建立數(shù)據(jù)庫

2、test數(shù)據(jù)庫上有表t1,假設(shè)沒有,運行

CREATE TABLE `t1` (

`id` int(11) default NULL,

`name` varchar(100) default NULL

)

建立表t1

testsql.c:

/* testsql.c** An example to use MYSQL C API

** Copyright 2004 Coon Xu.

** Author: Coon Xu

** Date:05 Nov 2004*/

#include

#include int main(){MYSQL mysql;?????// need a instance to init

MYSQL_RES *res;

MYSQL_ROW row;

char *query;

int t,r;// connect the databasemysql_init(&mysql);

if (!mysql_real_connect(&mysql,"localhost", "mmim", "mmim", "test",0,NULL,0))

{

printf( "Error connecting to database: %s/n",mysql_error(&mysql));

}

else printf("Connected.../n");// get the result from the executing select query

query = "select * from t1";

t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));

if (t)

{

printf("Error making query: %s/n",

mysql_error(&mysql));

}

else printf("[%s] made.../n", query);res = mysql_store_result(&mysql);while(row = mysql_fetch_row(res))

{

for(t=0;t

{

printf("%s ",row[t]);

}

printf("/n");

}

printf("mysql_free_result.../n");

mysql_free_result(res);?????//free result after you get the result

sleep(1);

// execute the insert query

query = "insert into t1(id, name) values(3, ‘kunp‘)";

t = mysql_real_query(&mysql,query,(unsigned int) strlen(query));

if (t)

{

printf("Error making query: %s/n",

mysql_error(&mysql));

}

else printf("[%s] made.../n", query);

mysql_close(&mysql);

return 0;

}

編譯

假定mysql的頭文件在/usr/include/mysql,庫文件在/usr/lib/mysql,運行下列命令進行編譯:

gcc testsql.c -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient

總結(jié)

以上是生活随笔為你收集整理的mysql c api example_The MySQL C API 编程实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。