mysql c api查詢過程介紹
2005-3-28 keep_thinking
一、概述
mysql的c api的查詢主要分成兩類,字串組成的sql語句的查詢,包含二進位制資料的sql語句的查詢。第一類查詢只需要傳入sql語句給查詢函式即可,第二類查詢不但需要傳遞sql語句,還要傳入sql語句的長度。顯然第一類查詢是不需要傳遞長度的,因為系統知道null表示字串的終結。而第二種查詢必須傳遞sql語句的長度,因為含有二進位制的資料的sql語句中有可能會有值為null的位元組,如果還是按照第一種的策略來取查詢語句的長度,顯然會存在將其中途截斷的危險。
下面分別對第一類查詢和第二類查詢各舉乙個例子。
二、傳入不含二進位制資料的sql語句的查詢
首先請粗略的看一遍**,下面進行詳細地分析。
void
db_do_query
(mysql*db
, const
char
*query
)mysql_free_result
(res);}
else
(void
)printf
("affected rows: %lld/n"
, mysql_affected_rows(db
));return
;err
:die(
db,
"db_do_query failed: %s [%s]"
, mysql_error(db
), query);}
對於不包含二進位制資料的查詢,最核心的就是上面這一段**
1. mysql_query是mysql的查詢函式它需要2個引數,乙個是指向mysql結構型別的指標,另乙個是包含sql查詢語句的字串。mysql_query函式本身並不能返查詢後的結果,要得到結果需要再呼叫另乙個函式mysql_store_result。
2. 函式mysql_store_result的返回值是乙個指向mysql_res結構的指標,該指標指向了查詢結果。但是還是不能直接通過mysql_res列印出每乙個資料項。
3. 需要呼叫mysql_fetch_row函式來得到指向每乙個查詢結果的資料項的指標,該函式需要反覆呼叫,每呼叫一次就返回一行的指標。在上述**中,用迴圈語句反覆呼叫的,直到結果表的末尾。另外你也可以使用mysql_num_rows函式返回查詢結果集有多少行資料。
4. mysql_fetch_row函式返回的結果是乙個mysql_row結構的指標,該指標可以看成乙個字串陣列,該數組成存放著查詢結果的一行的每個域的值,可以通過中括號運算子索引。
5. 這時候還有乙個問題,究竟得到的查詢結果表有多少個域呢?,這個值可以通過函式mysql_num_fields得到。
三、傳入含有二進位制資料的sql語句的查詢
先看下面的**,注意與上面列出的傳入字串資料的sql語句的查詢的源**不同的地方。
void
db_do_real_query
(mysql*db
, const
char
*query
, unsigned
intlen
)mysql_free_result
(res);}
else
(void
)printf
("affected rows: %lld/n"
, mysql_affected_rows(db
));return
;err
:die(
db,
"db_do_query failed: %s [%s]"
, mysql_error(db
), query);}
不同的地方只有兩個:
1. 函式需要傳入查詢的sql語句的長度,原因上文已述。
2. 就是需要乙個ulong型的指標來儲存結果集資料的寬度。
四、另外兩個問題
1.關於mysql_store_result和兩個mysql_use_result函式,這兩個函式都是得到查詢結果集的函式,例子程式中都是用的第乙個,可以換成第二個。這兩個函式的不同之處在於,第乙個函式會返回整個的結果集,第二個是逐個返回結果集的元組,當fetch的時候才返回後面的。
2.由於mysql的c api函式用到許多mysql自定義的型別,直接將其用到mfc的程式中是有問題的。或許是mysql的標頭檔案和stdafx.h不相容。解決的辦法是編寫乙個dll檔案用mfc編寫的程式呼叫。顯然dll也是不能用mfc寫的,需要用sdk來寫。
附錄、mysql c 變數型別
以下變數型別在mysql的庫當中定義。我們需要這些變數是為了使用mysql的函式。這些變數有詳細的解釋,但是這些解釋對於寫**來說並不重要。
mysql結構,一開始要定義乙個指向該結構型別的指標,在mysql後繼的所有關鍵函式,包括初始化、查詢、結束查詢都要用到這個指標作為引數
結構的定義:
typedef struct st_mysql mysql;
mysql_res用來表示查詢結果返回值的結構,
typedef struct st_mysql_res mysql_res;
其他資料型別和函式的說明參考mysql參考手冊。
Elasticsearch查詢過程
客戶端向集群中的某個節點 假設節點1 發起查詢請求,節點1會建立乙個from size大小的佇列 from 偏移量,size 要取回的文件個數 節點1向集群中所有其他的分片 主或從 發起查詢請求,每個分片也會建立乙個from size大小的佇列,並將查詢結果新增到佇列中。其他分片將查詢到的文件id和...
屬性查詢過程
import numbers class intfield 資料屬性描述符 實現了get和set def get self,instance,owner return self.value def set self,instance,value if not isinstance value,num...
DNS查詢過程
dns domain name system 將網域名稱和ip位址相互對映的乙個分布式資料庫服務。dns使用的是網路查詢,使用的埠是53號埠 通常dns是以udp資料傳輸協議來查詢的,當沒有查詢到完整的資訊時,就會再次以tcp這個協議來重新查詢。所以在啟動dns時,會同時啟動tcp和udp的53號埠...