- 論壇徽章:
- 0
|
來源
http://www.leftworld.net/
C API代碼是隨MySQL分發(fā)的,它被包含在mysqlclient庫且允許C程序存取一個(gè)數(shù)據(jù)庫。
在 MySQL源代碼分發(fā)中的很多客戶是用C編寫的。如果你正在尋找演示怎樣使用C API的例子,看一下這些客戶程序。
大多數(shù)其他客戶 API(除了Java的所有)都使用mysqlclient庫與MySQL服務(wù)器通信。這意味著,例如,你能利用很多被其他客戶程序使用的同一環(huán)境變量,因?yàn)樗麄儚膸熘幸。對這些變量的一張表,見12.1 不同的MySQL程序的概述。
客戶有一個(gè)最大通訊緩沖區(qū)大小。初始分配的緩沖區(qū)大小(16K字節(jié)) 自動(dòng)地增加到最大尺寸(缺省的最大值是24M)。因?yàn)榫彌_區(qū)大小只是按保證需求而被增加,簡單地增加缺省的最大限制并不造成更多被消耗。該尺寸檢查主要是一個(gè)對錯(cuò)誤的查詢和通訊包的檢查。
通訊緩沖區(qū)必須足夠大以便一個(gè)單獨(dú)的SQL語句(對客戶-服務(wù)器傳輸)和一行
返回的數(shù)據(jù)(對服務(wù)器-客戶傳輸)。每個(gè)線程的通訊緩沖區(qū)被動(dòng)態(tài)擴(kuò)大到最大限制來處理任何查詢或行。例如,如果你包含大到16M數(shù)據(jù)的BLOB值,你必須
有一個(gè)至少16M通訊緩沖區(qū)限制(在服務(wù)器和客戶兩端)。客戶的缺省最大值是24M,但是在服務(wù)器端的缺省最大值是1M。你可以在服務(wù)器啟動(dòng)時(shí)通過改變
max_allowed_packet參數(shù)的值來改變它。見10.2.3 調(diào)節(jié)服務(wù)器參數(shù)。
MySQL服務(wù)器在每個(gè)查詢后縮小每個(gè)通訊緩沖區(qū)到net_buffer_length個(gè)字節(jié)。對客戶,與一個(gè)連接相關(guān)的緩沖區(qū)的大小沒被減少,直到連接被關(guān)閉,在此時(shí)客戶內(nèi)存被回收。
如果你用線程的編程,你應(yīng)該用--with-thread-safe-client編譯MySQL C API,這將使C API線程對每個(gè)連接更安全。你可以讓2個(gè)線程共享相同的連接,只要如果你做下列事情:
兩個(gè)線程不能同時(shí)在同一個(gè)連接上發(fā)送查詢到MySQL。特別是你必須保證在一個(gè)mysql_query()和mysql_store_result()之間沒有其他線程正在使用同一個(gè)連接。
許多線程能存取用mysql_store_result()檢索出來的不同結(jié)果集合。
如果你使用mysql_use_result,你必須保證沒有其他線程在同一個(gè)連接上正在詢問任何東西,直到結(jié)果集合被關(guān)閉。
20.2 C API數(shù)據(jù)類型
MYSQL
這個(gè)結(jié)構(gòu)表示對一個(gè)數(shù)據(jù)庫連接的句柄,它被用于幾乎所有的MySQL函數(shù)。
MYSQL_RES
這個(gè)結(jié)構(gòu)代表返回行的一個(gè)查詢的(SELECT, SHOW, DESCRIBE, EXPLAIN)的結(jié)果。從查詢返回的信息在本章下文稱為結(jié)果集合。
MYSQL_ROW
這是一個(gè)行數(shù)據(jù)的類型安全(type-safe)的表示。當(dāng)前它實(shí)現(xiàn)為一個(gè)計(jì)數(shù)字節(jié)的字符串?dāng)?shù)組。(如果字段值可能包含二進(jìn)制數(shù)據(jù),你不能將這些視為空終止串,因?yàn)檫@樣的值可以在內(nèi)部包含空字節(jié)) 行通過調(diào)用mysql_fetch_row()獲得。
MYSQL_FIELD
這個(gè)結(jié)構(gòu)包含字段信息,例如字段名、類型和大小。其成員在下面更詳細(xì)地描述。你可以通過重復(fù)調(diào)用mysql_fetch_field()對每一列獲得MYSQL_FIELD結(jié)構(gòu)。字段值不是這個(gè)結(jié)構(gòu)的部分;他們被包含在一個(gè)MYSQL_ROW結(jié)構(gòu)中。
MYSQL_FIELD_OFFSET
這是一個(gè)相對一個(gè)MySQL字段表的偏移量的類型安全的表示。(由mysql_field_seek()使用。) 偏移量是在一行以內(nèi)的字段編號,從0開始。
my_ulonglong
該
類型用于行編號和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。這種類型提供0
到1.84e19的一個(gè)范圍。在一些系統(tǒng)上,試圖打印類型my_ulonglong的值將不工作。為了打印出這樣的值,將它變換到unsigned
long并且使用一個(gè)%lu打印格式。例如:
printf (Number of rows: %lu\n", (unsigned long) mysql_num_rows(result));
MYSQL_FIELD結(jié)構(gòu)包含列在下面的成員:
char * name
字段名,是一個(gè)空結(jié)尾的字符串。
char * table
包含該字段的表的名字,如果它不是可計(jì)算的字段。對可計(jì)算的字段,table值是一個(gè)空字符串。
char * def
這字段的缺省值,是一個(gè)空結(jié)尾的字符串。只要你使用,只有你使用mysql_list_fields()才可設(shè)置它。
enum enum_field_types type
字段類型。type值可以是下列之一:類型值 類型含義
FIELD_TYPE_TINY TINYINT字段
FIELD_TYPE_SHORT SMALLINT字段
FIELD_TYPE_LONG INTEGER字段
FIELD_TYPE_INT24 MEDIUMINT字段
FIELD_TYPE_LONGLONG BIGINT字段
FIELD_TYPE_DECIMAL DECIMAL或NUMERIC字段
FIELD_TYPE_FLOAT FLOAT字段
FIELD_TYPE_DOUBLE DOUBLE或REAL字段
FIELD_TYPE_TIMESTAMP TIMESTAMP字段
FIELD_TYPE_DATE DATE字段
FIELD_TYPE_TIME TIME字段
FIELD_TYPE_DATETIME DATETIME字段
FIELD_TYPE_YEAR YEAR字段
FIELD_TYPE_STRING 字符串(CHAR或VARCHAR)字段
FIELD_TYPE_BLOB BLOB或TEXT字段(使用max_length決定最大長度)
FIELD_TYPE_SET SET字段
FIELD_TYPE_ENUM ENUM字段
FIELD_TYPE_NULL NULL- 類型字段
FIELD_TYPE_CHAR 不推薦;使用FIELD_TYPE_TINY代替
你可以使用IS_NUM()宏來測試字段是否有一種數(shù)字類型。將type值傳給IS_NUM()并且如果字段是數(shù)字的,它將計(jì)算為TRUE:
if (IS_NUM(field->type))
printf("Field is numeric\n");
unsigned int length
字段寬度,在表定義中指定。
unsigned int max_length
對結(jié)果集合的字段的最大寬度(對實(shí)際在結(jié)果集合中的行的最長字段值的長度)。如果你使用mysql_store_result()或mysql_list_fields(),這包含字段最大長度。如果你使用mysql_use_result(),這個(gè)變量的值是零。
unsigned int flags
字段的不同位標(biāo)志。flags值可以是零個(gè)或多個(gè)下列位設(shè)置:標(biāo)志值 標(biāo)志含義
NOT_NULL_FLAG 字段不能是NULL
PRI_KEY_FLAG 字段是一個(gè)主鍵的一部分
UNIQUE_KEY_FLAG 字段是一個(gè)唯一鍵的一部分
MULTIPLE_KEY_FLAG 字段是一個(gè)非唯一鍵的一部分。
UNSIGNED_FLAG 字段有UNSIGNED屬性
ZEROFILL_FLAG 字段有ZEROFILL屬性
BINARY_FLAG 字段有BINARY屬性
AUTO_INCREMENT_FLAG 字段有AUTO_INCREMENT屬性
ENUM_FLAG 字段是一個(gè)ENUM(不推薦)
BLOB_FLAG 字段是一個(gè)BLOB或TEXT(不推薦)
TIMESTAMP_FLAG 字段是一個(gè)TIMESTAMP(不推薦)
BLOB_FLAG、ENUM_FLAG和TIMESTAMP_FLAG標(biāo)志
的使用是不推薦的,因?yàn)樗麄冎赋鲎侄蔚念愋投撬念愋蛯傩。對FIELD_TYPE_BLOB、FIELD_TYPE_ENUM或
FIELD_TYPE_TIMESTAMP,最好是測試field->type。下面例子演示了一個(gè)典型的flags值用法:
if (field->flags & NOT_NULL_FLAG)
printf("Field can't be null\n");
你可以使用下列方便的宏決來確定flags值的布爾狀態(tài):
IS_NOT_NULL(flags) 真,如果該字段被定義為NOT NULL
IS_PRI_KEY(flags) 真,如果該字段是一個(gè)主鍵
IS_BLOB(flags) 真,如果該字段是一個(gè)BLOB或TEXT(不推薦;相反測試field->type)
unsigned int decimals
對數(shù)字字段的小數(shù)位數(shù)。
20.3 C API函數(shù)概述
在 C API 中可用的函數(shù)列在下面,并且在下一節(jié)更詳細(xì)地描述。見20.4 C API函數(shù)描述。
mysql_affected_rows() 返回被最新的UPDATE, DELETE或INSERT查詢影響的行數(shù)。
mysql_close() 關(guān)閉一個(gè)服務(wù)器連接。
mysql_connect() 連接一個(gè)MySQL服務(wù)器。該函數(shù)不推薦;使用mysql_real_connect()代替。
mysql_change_user() 改變在一個(gè)打開的連接上的用戶和數(shù)據(jù)庫。
mysql_create_db() 創(chuàng)建一個(gè)數(shù)據(jù)庫。該函數(shù)不推薦;而使用SQL命令CREATE DATABASE。
mysql_data_seek() 在一個(gè)查詢結(jié)果集合中搜尋一任意行。
mysql_debug() 用給定字符串做一個(gè)DBUG_PUSH。
mysql_drop_db() 拋棄一個(gè)數(shù)據(jù)庫。該函數(shù)不推薦;而使用SQL命令DROP DATABASE。
mysql_dump_debug_info() 讓服務(wù)器將調(diào)試信息寫入日志文件。
mysql_eof() 確定是否已經(jīng)讀到一個(gè)結(jié)果集合的最后一行。這功能被反對; mysql_errno()或mysql_error()可以相反被使用。
mysql_errno() 返回最近被調(diào)用的MySQL函數(shù)的出錯(cuò)編號。
mysql_error() 返回最近被調(diào)用的MySQL函數(shù)的出錯(cuò)消息。
mysql_escape_string() 用在SQL語句中的字符串的轉(zhuǎn)義特殊字符。
mysql_fetch_field() 返回下一個(gè)表字段的類型。
mysql_fetch_field_direct () 返回一個(gè)表字段的類型,給出一個(gè)字段編號。
mysql_fetch_fields() 返回一個(gè)所有字段結(jié)構(gòu)的數(shù)組。
mysql_fetch_lengths() 返回當(dāng)前行中所有列的長度。
mysql_fetch_row() 從結(jié)果集合中取得下一行。
mysql_field_seek() 把列光標(biāo)放在一個(gè)指定的列上。
mysql_field_count() 返回最近查詢的結(jié)果列的數(shù)量。
mysql_field_tell() 返回用于最后一個(gè)mysql_fetch_field()的字段光標(biāo)的位置。
mysql_free_result() 釋放一個(gè)結(jié)果集合使用的內(nèi)存。
mysql_get_client_info() 返回客戶版本信息。
mysql_get_host_info() 返回一個(gè)描述連接的字符串。
mysql_get_proto_info() 返回連接使用的協(xié)議版本。
mysql_get_server_info() 返回服務(wù)器版本號。
mysql_info() 返回關(guān)于最近執(zhí)行得查詢的信息。
mysql_init() 獲得或初始化一個(gè)MYSQL結(jié)構(gòu)。
mysql_insert_id() 返回有前一個(gè)查詢?yōu)橐粋(gè)AUTO_INCREMENT列生成的ID。
mysql_kill() 殺死一個(gè)給定的線程。
mysql_list_dbs() 返回匹配一個(gè)簡單的正則表達(dá)式的數(shù)據(jù)庫名。
mysql_list_fields() 返回匹配一個(gè)簡單的正則表達(dá)式的列名。
mysql_list_processes() 返回當(dāng)前服務(wù)器線程的一張表。
mysql_list_tables() 返回匹配一個(gè)簡單的正則表達(dá)式的表名。
mysql_num_fields() 返回一個(gè)結(jié)果集合重的列的數(shù)量。
mysql_num_rows() 返回一個(gè)結(jié)果集合中的行的數(shù)量。
mysql_options() 設(shè)置對mysql_connect()的連接選項(xiàng)。
mysql_ping() 檢查對服務(wù)器的連接是否正在工作,必要時(shí)重新連接。
mysql_query() 執(zhí)行指定為一個(gè)空結(jié)尾的字符串的SQL查詢。
mysql_real_connect() 連接一個(gè)MySQL服務(wù)器。
mysql_real_query() 執(zhí)行指定為帶計(jì)數(shù)的字符串的SQL查詢。
mysql_reload() 告訴服務(wù)器重裝授權(quán)表。
mysql_row_seek() 搜索在結(jié)果集合中的行,使用從mysql_row_tell()返回的值。
mysql_row_tell() 返回行光標(biāo)位置。
mysql_select_db() 連接一個(gè)數(shù)據(jù)庫。
mysql_shutdown() 關(guān)掉數(shù)據(jù)庫服務(wù)器。
mysql_stat() 返回作為字符串的服務(wù)器狀態(tài)。
mysql_store_result() 檢索一個(gè)完整的結(jié)果集合給客戶。
mysql_thread_id() 返回當(dāng)前線程的ID。
mysql_use_result() 初始化一個(gè)一行一行地結(jié)果集合的檢索。
為了連接服務(wù)器,調(diào)用mysql_init()以初始化一個(gè)連接處理器,然后用該處理器調(diào)用mysql_real_connect()(還有其他信息例如主機(jī)名、用戶名和口令)。當(dāng)你用該連接完成工作后,調(diào)用mysql_close()終止它。
當(dāng)一個(gè)連接活躍時(shí),客戶可以用mysql_query()或
mysql_real_query()將SQL查詢發(fā)送到服務(wù)器。兩者的差別是mysql_query()期望查詢作為一個(gè)空結(jié)尾的字符串來指定而
mysql_real_query()期望一個(gè)計(jì)數(shù)的字符串。如果字符串包含二進(jìn)制數(shù)據(jù)(它可以包括空字節(jié)),你必須使用
mysql_real_query()。
對與每個(gè)非--SELECT查詢(例如,INSERT、UPDATE、DELETE等),你可以調(diào)用mysql_affected_rows()知道有多少行受到影響(改變)。
對于SELECT查詢,你作為一個(gè)結(jié)果集合來檢索選擇的行。(注意一些語句是類SELECT的,他們返回行。這些包括SHOW、DESCRIBE和EXPLAIN。他們應(yīng)該象SELECT語句相同的方式來對待。)
對客戶,有兩種方法處理結(jié)果集合。一種方法是通過調(diào)用
mysql_store_result()立刻檢索全部結(jié)果。該函數(shù)從服務(wù)器獲得查詢返回的所有行,并將他們存儲在客戶端。第二種方法是對客戶通過調(diào)用
mysql_use_result()初始化一個(gè)一行一行地結(jié)果集合的檢索。該函數(shù)初始化檢索,但是實(shí)際上不從服務(wù)器獲得任何行。
在兩種情況中,你通過mysql_fetch_row()存取行。用
mysql_store_result()、mysql_fetch_row()儲存取已經(jīng)從服務(wù)器被取出的行。用
mysql_use_result()、mysql_fetch_row()實(shí)際上從服務(wù)器檢索行。調(diào)用mysql_fetch_lengths()可獲
得關(guān)于每行中數(shù)據(jù)值尺寸的信息。
在你用完一個(gè)結(jié)果集合以后,調(diào)用mysql_free_result()釋放由它使用的內(nèi)存。
兩種檢索機(jī)制是互補(bǔ)的?蛻舫绦驊(yīng)該選擇最適合他們的要求的途徑。在實(shí)踐中,客戶通常更愿意使用mysql_store_result()。
mysql_store_result()的一個(gè)優(yōu)點(diǎn)是既然行均被客戶取到,
你不僅能順序存取行,你也能mysql_data_seek()或mysql_row_seek()在結(jié)果集合中前后移動(dòng)以改變在結(jié)果集合中的當(dāng)前行位
置。你也能通過調(diào)用mysql_num_rows()知道有多少行。另一方面,mysql_store_result()的內(nèi)存需求對較大結(jié)果集合可能很
高,并且你最可能遇到out-of-memory情況。
mysql_use_result()的一個(gè)優(yōu)點(diǎn)是客戶為結(jié)果集合需要較
少的內(nèi)存,因?yàn)樗淮沃皇蔷S持一行(并且因?yàn)橛休^少的分配開銷,mysql_use_result()能更快些)。缺點(diǎn)是你必須盡快處理每一行以避免困住
服務(wù)器,你不必再結(jié)果集合中隨意存取行(你只能順序存取行),而且你不知道在結(jié)果集合中有多少行,直到你檢索全部結(jié)果。還有,你必須檢索出所有行,即使你
在檢索中途確定你已找到了想尋找的信息。
API使得客戶正確應(yīng)答查詢成為可能(僅檢索必要的行),不用知道查詢是
否是一個(gè)SELECT。你可以通過在mysql_query()(或mysql_real_query())之后調(diào)用
mysql_store_result()做到。如果結(jié)果集合調(diào)用成功并且查詢是一個(gè)SELECT,你能讀取行。如果結(jié)果集合調(diào)用,調(diào)用
mysql_field_count()確定結(jié)果是否是實(shí)際期望的。如果mysql_field_count()返回0,查詢沒有返回?cái)?shù)據(jù)(表明它是一個(gè)
INSERT、UPDATE、DELETE等),所以不期望返回行。如果mysql_field_count()是非零,查詢應(yīng)該有返回行,但是沒有。這
表明查詢是一個(gè)失敗的SELECT。見mysql_field_count()如何能做到的例子的描述。
mysql_store_result()和
mysql_use_result()都允許你獲得有關(guān)組成結(jié)果集合的字段的信息(字段數(shù)量、他們的名字和類型等等)。你可以通過重復(fù)調(diào)用
mysql_fetch_field()在行中順序存取字段信息,或調(diào)用mysql_fetch_field_direct()存取行中的字段編號。當(dāng)前
字段光標(biāo)位置可以通過調(diào)用mysql_field_seek()改變,設(shè)置字段光標(biāo)影響到后續(xù)mysql_fetch_field()調(diào)用。你也能通過調(diào)
用mysql_fetch_fields()馬上獲得字段信息。
對于檢測和報(bào)告錯(cuò)誤,MySQL借助于mysql_errno()和mysql_error()函數(shù)提供錯(cuò)誤信息的存取。他們返回最近調(diào)用的可能成功或失敗的函數(shù)的錯(cuò)誤代碼或錯(cuò)誤消息,允許你確定何時(shí)發(fā)生一個(gè)錯(cuò)誤和什么錯(cuò)誤。
20.4 C API函數(shù)描述
在下面的描述中,一個(gè)NULL參數(shù)或返回值含義是在C編程語言環(huán)境的NULL,不是一個(gè)MySQL NULL值。
返回一個(gè)值的函數(shù)一般返回一個(gè)指針或一個(gè)整數(shù)。除非另外指定,返回一個(gè)指針的
函數(shù)返回一個(gè)非
NULL值表明成功,或一個(gè)NULL值表明一個(gè)錯(cuò)誤,而返回一個(gè)整數(shù)的函數(shù)返回零表示成功,或非零表示一個(gè)錯(cuò)誤。注意,“非零”只有這個(gè)含義。除非函數(shù)描
述另外說明,不要測試一個(gè)零以外的其他值:
if (result) /* 正確 */
... error ...
if (result
if (result == -1) /* 不正確 */
... error ...
當(dāng)函數(shù)返回一個(gè)錯(cuò)誤時(shí),函數(shù)描述的錯(cuò)誤小節(jié)列出錯(cuò)誤可能的類型。你可以調(diào)用mysql_errno()找出發(fā)生了這些重的哪一個(gè)。錯(cuò)誤的字符串表示可以調(diào)用mysql_error()獲得。
20.4.1 mysql_affected_rows()
my_ulonglong mysql_affected_rows(MYSQL *mysql)
20.4.1.1 說明
返回受到最后一個(gè)UPDATE、DELETE
或INSERT查詢影響(變化)的行數(shù)。可以在針對UPDATE、DELETE或INSERT語句的mysql_query()之后立即調(diào)用。對于
SELECT語句,mysql_affected_rows()的功能于mysql_num_rows()相同。
mysql_affected_rows()目前以一個(gè)宏(macro)來實(shí)現(xiàn)。
20.4.1.2 返回值
大于零的一個(gè)整數(shù)表示受到影響或檢索出來的
行數(shù)。零表示沒有匹配查序中WHERE子句的記錄或目前還沒有查詢被執(zhí)行。-1表示查詢返回一個(gè)錯(cuò)誤,或?qū)τ谝粋(gè)SELECT查
詢,mysql_affected_rows()在調(diào)用mysql_store_result()之前被調(diào)用。
20.4.1.3 錯(cuò)誤
沒有。
20.4.1.4 范例
mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10");
printf("%d products updated",mysql_affected_rows(&mysql));
20.4.2 mysql_close()
void mysql_close(MYSQL *mysql)
20.4.2.1 說明
關(guān)閉一個(gè)以前打開了的連接。如果句柄由mysql_init()或mysql_connect()自動(dòng)分配,mysql_close()也釋放被mysql指向的連接句柄。
20.4.2.2 返回值
沒有。
20.4.2.3 錯(cuò)誤
CR_COMMANDS_OUT_OF_SYNC
命令以一個(gè)不正確的次序被執(zhí)行。
CR_SERVER_GONE_ERROR
MySQL服務(wù)器關(guān)閉了。
CR_SERVER_LOST
對服務(wù)者的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個(gè)未知的錯(cuò)誤。
20.4.3 mysql_connect()
MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)
20.4.3.1 說明
該函數(shù)不推薦使用,而更好使用mysql_real_connect()。
mysql_connect()試圖建立一個(gè)對運(yùn)行在host的一個(gè)MySQL數(shù)據(jù)庫引擎的連接。mysql_connect()必須在你能執(zhí)行其他API函數(shù)之前成功地完成,除了mysql_get_client_info()。
參數(shù)的含義與mysql_connect()相應(yīng)的參數(shù)相同,不同的是連接參
數(shù)可以是NULL。在這種情況下,C API
自動(dòng)為連接結(jié)構(gòu)分配內(nèi)存,并且當(dāng)你調(diào)用mysql_close(),釋放它。這種方法的缺點(diǎn)是如果連接失敗,你不能檢索出一條錯(cuò)誤消息。(為了從
mysql_errno()或mysql_error()得到錯(cuò)誤信息,你必須提供一個(gè)有效的MYSQL指針。)
20.4.3.2 返回值
同mysql_real_connect()。
20.4.3.3 錯(cuò)誤
同mysql_real_connect()。
20.4.4mysql_change_user()
my_bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db)
20.4.4.1 說明
改變用戶并且使得由db指定數(shù)據(jù)庫成為由mysql指定的連接上的缺省(當(dāng)前)數(shù)據(jù)庫。在隨后的查詢中,這個(gè)數(shù)據(jù)庫是不包括一個(gè)明確的數(shù)據(jù)庫指定符的表引用的缺省值。
這個(gè)函數(shù)功能在MySQL 3.23.3中引入。
除非連接的用戶能被認(rèn)證或如果他沒有權(quán)限使用數(shù)據(jù)庫,mysql_change_user()失敗。在這種情況下,用戶和數(shù)據(jù)庫都沒被改變。
如果你不想有一個(gè)缺省數(shù)據(jù)庫,db參數(shù)可以被設(shè)置為NULL。
20.4.4.2 返回值
成功,零。如果發(fā)生一個(gè)錯(cuò)誤發(fā)生,非零。
20.4.4.3 錯(cuò)誤
與你能從mysql_real_connect()得到的相同。
CR_COMMANDS_OUT_OF_SYNC
命令以一個(gè)不正確的次序被執(zhí)行。
CR_SERVER_GONE_ERROR
MySQL服務(wù)者關(guān)閉了。
CR_SERVER_LOST
對服務(wù)者的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個(gè)未知的錯(cuò)誤。
ER_UNKNOWN_COM_ERROR
MySQL服務(wù)器未實(shí)現(xiàn)這個(gè)命令(可能是一個(gè)老的服務(wù)器)
ER_ACCESS_DENIED_ERROR
用戶或口令錯(cuò)誤。
ER_BAD_DB_ERROR
數(shù)據(jù)庫不存在。
ER_DBACCESS_DENIED_ERROR
用戶沒有數(shù)據(jù)庫的存取權(quán)利。
ER_WRONG_DB_NAME
數(shù)據(jù)庫名字太長。
20.4.4.4 范例
if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
fprintf(stderr, "Failed to change user. Error: %s\n",
mysql_error(&mysql));
}
20.4.5 mysql_create_db()
int mysql_create_db(MYSQL *mysql, const char *db)
20.4.5.1 說明
創(chuàng)建由db參數(shù)命名的數(shù)據(jù)庫。
這個(gè)函數(shù)不推薦,而最好使用mysql_query()發(fā)出一條SQL CREATE DATABASE語句。
20.4.5.2 返回值
如果數(shù)據(jù)庫成功地被創(chuàng)造,零。如果發(fā)生一個(gè)錯(cuò)誤,非零。
20.4.5.3 錯(cuò)誤
CR_COMMANDS_OUT_OF_SYNC
命令以一個(gè)不正確的次序被執(zhí)行。
CR_SERVER_GONE_ERROR
MySQL服務(wù)器關(guān)閉了。
CR_SERVER_LOST
對服務(wù)者的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個(gè)未知的錯(cuò)誤。
20.4.5.4 范例
if(mysql_create_db(&mysql, "my_database"))
{
fprintf(stderr, "Failed to create new database. Error: %s\n",
mysql_error(&mysql));
}
20.4.6 mysql_data_seek()
void mysql_data_seek(MYSQL_RES *result, unsigned long long offset)
20.4.6.1 說明
在一個(gè)查詢結(jié)果集合中定位任意行。這要求結(jié)果集合結(jié)構(gòu)包含查詢的全部結(jié)果,這樣mysql_data_seek()可以僅需與mysql_store_result()一起使用,不是與mysql_use_result()。
偏移量應(yīng)該是從0到mysql_num_rows(result)-1范圍的一個(gè)值。
20.4.6.2 返回值
無。
20.4.6.3 錯(cuò)誤
無。
20.4.7 mysql_debug()
void mysql_debug(char *debug)
20.4.7.1 說明
用一個(gè)給定字符串做一個(gè)DBUG_PUSH。mysql_debug()使用Fred Fish 調(diào)試庫。為了使用這個(gè)函數(shù),你必須編譯客戶庫以支持調(diào)試。見G.1 調(diào)試一個(gè)MySQL服務(wù)器和節(jié)G.2 調(diào)試一個(gè)MySQL客戶。
20.4.7.2 返回值
無。
20.4.7.3 錯(cuò)誤
無。
20.4.7.4 范例
下面所示的調(diào)用使得客戶庫在客戶機(jī)器上的“/tmp/client.trace”中產(chǎn)生一個(gè)跟蹤文件:
mysql_debug("d:t:O,/tmp/client.trace");
20.4.8 mysql_drop_db()
int mysql_drop_db(MYSQL *mysql, const char *db)
20.4.8.1 說明
拋棄由db參數(shù)命名的數(shù)據(jù)庫。
這個(gè)函數(shù)不推薦,而最好使用mysql_query()發(fā)出一條SQL DROP DATABASE語句。
20.4.8.2 返回值
如果數(shù)據(jù)庫成功地被破拋棄,零。如果發(fā)生一個(gè)錯(cuò)誤,非零。
20.4.8.3 錯(cuò)誤
CR_COMMANDS_OUT_OF_SYNC
命令以一個(gè)不正確的次序被執(zhí)行。
CR_SERVER_GONE_ERROR
MySQL服務(wù)器關(guān)閉了。
CR_SERVER_LOST
對服務(wù)者的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個(gè)未知的錯(cuò)誤。
20.4.8.4 范例
if(mysql_drop_db(&mysql, "my_database"))
fprintf(stderr, "Failed to drop the database: Error: %s\n",
mysql_error(&mysql));
20.4.9 mysql_dump_debug_info()
int mysql_dump_debug_info(MYSQL *mysql)
20.4.9.1 說明
指示服務(wù)者將一些調(diào)試信息寫入日志文件。連接的用戶對此必須有precess權(quán)限才能工作。
20.4.9.2 返回值
如果命令成功,零。如果發(fā)生一個(gè)錯(cuò)誤,非零。
20.4.9.3 錯(cuò)誤
CR_COMMANDS_OUT_OF_SYNC
命令以一個(gè)不正確的次序被執(zhí)行。
CR_SERVER_GONE_ERROR
MySQL服務(wù)者關(guān)閉了。
CR_SERVER_LOST
對服務(wù)器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個(gè)未知的錯(cuò)誤。
20.4.10 mysql_eof()
my_bool mysql_eof(MYSQL_RES *result)
20.4.10.1 說明
這個(gè)函數(shù)不推薦,而使用mysql_errno()或mysql_error()。
mysql_eof()確定是否已經(jīng)讀到了一個(gè)結(jié)果集合的最后一行。
如果你從成功的mysql_store_result()調(diào)用獲得一個(gè)結(jié)果集合,客戶程序用一個(gè)操作收到全部集合。在這種情況下,從mysql_fetch_row()返回一個(gè)NULL總是意味著已經(jīng)到達(dá)了結(jié)果集合的尾部,沒必要調(diào)用mysql_eof()。
在另一方面,如果你使用mysql_use_result()初始化一個(gè)結(jié)果
集合的檢索,該集合的行隨著你重復(fù)調(diào)用mysql_fetch_row()一個(gè)一個(gè)地從服務(wù)器獲得。因?yàn)樵谶@個(gè)過程中在連接上可能發(fā)生一個(gè)錯(cuò)誤,從
mysql_fetch_row()返回一個(gè)NULL值并不意味著集合正常到達(dá)了尾部。在這種情況下,你能使用mysql_eof()確定發(fā)生了什么。如
果到達(dá)結(jié)果集合的尾部,mysql_eof()返回非零值,并且如果發(fā)生一個(gè)錯(cuò)誤,返回零。
在時(shí)間上,mysql_eof()先于標(biāo)準(zhǔn)MySQL錯(cuò)誤函數(shù)
mysql_errno()和mysql_error()。因?yàn)檫@些錯(cuò)誤函數(shù)提供相同的信息,他們的使用更好mysql_eof(),它現(xiàn)在不建議使
用。(事實(shí)上,他們提供更多的信息,因?yàn)閙ysql_eof()值返回一個(gè)布爾值,而錯(cuò)誤函數(shù)指出當(dāng)發(fā)生錯(cuò)誤時(shí)的出錯(cuò)原因。)
20.4.10.2 返回值
如果發(fā)生一個(gè)錯(cuò)誤,零。如果到達(dá)結(jié)果集合的結(jié)束,非零。
20.4.10.3 錯(cuò)誤
無。
20.4.10.4 范例
下列例子顯示你必須如何使用mysql_eof():
mysql_query(&mysql,"SELECT * FROM some_table");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
// do something with data
}
if(!mysql_eof(result)) // mysql_fetch_row() failed due to an error
{
fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}
然而,你可以用標(biāo)準(zhǔn)MySQL錯(cuò)誤函數(shù)完成同樣的效果:
mysql_query(&mysql,"SELECT * FROM some_table");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
// do something with data
}
if(mysql_errno(&mysql)) // mysql_fetch_row() failed due to an error
{
fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}
20.4.11 mysql_errno()
unsigned int mysql_errno(MYSQL *mysql)
20.4.11.1 說明
對于由mysql指定的連
接,mysql_errno()返回最近調(diào)用的可能成功或失敗的API函數(shù)的錯(cuò)誤代碼。返回值零意味著沒有錯(cuò)誤發(fā)生?蛻翦e(cuò)誤消息編號列出在
MySQL“errmsg.h”頭文件中。服務(wù)器錯(cuò)誤消息編號列出在“mysqld_error.h”中。
20.4.11.2 返回值:
一個(gè)錯(cuò)誤代碼值。如果沒有錯(cuò)誤發(fā)生,零。
20.4.11.3 錯(cuò)誤
無。
20.4.12 mysql_error()
char *mysql_error(MYSQL *mysql)
20.4.12.1 說明
對于由mysql指定的連接,mysql_errno()返回最近調(diào)用的可能成功或失敗的API函數(shù)的錯(cuò)誤代碼。如果沒有錯(cuò)誤發(fā)生,返回空字符串("")。這意味著下列兩個(gè)測試是等價(jià)的:
if(mysql_errno(&mysql))
{
// an error occurred
}
if(mysql_error(&mysql)[0] != '\0')
{
// an error occurred
}
客戶錯(cuò)誤消息的語言可通過重新編譯MySQL客戶庫來改變。目前,你能在幾種不同的語言間選取錯(cuò)誤消息。見9.1 MySQL支持什么語言?。
20.4.12.2 返回值
一個(gè)描述錯(cuò)誤的字符串。如果沒有錯(cuò)誤發(fā)生,空字符串。
20.4.12.3 錯(cuò)誤
無。
20.4.13 mysql_escape_string()
unsigned int mysql_escape_string(char *to, const char *from, unsigned int length)
20.4.13.1 說明
把在from中的字符串編碼為在一條SQL
語句中可以發(fā)給服務(wù)器的轉(zhuǎn)義的SQL字符串,將結(jié)果放在to中, 并且加上一個(gè)終止的空字節(jié)。編碼的字符是NUL(ASCII
0)、‘\n’、‘\r’、‘\’、‘'’、‘"’和Control-Z(見7.1 文字:如何寫字符串和數(shù)字)。
由from指向的字符串必須是length個(gè)字節(jié)長。你必須分配to的緩
沖區(qū)至少length*2+1個(gè)字節(jié)長。(在更壞的情況,每個(gè)字符可能需要使用2個(gè)字節(jié)被編碼,并且你需要為終止空字節(jié)的空間)
當(dāng)mysql_escape_string()返回時(shí),to的內(nèi)容將是空字符終止的字符串。返回值是編碼后的字符串的長度,不包括終止空字符。
20.4.13.2 范例
char query[1000],*end;
end = strmov(query,"INSERT INTO test_table values(");
*end++ = '\'';
end += mysql_escape_string(end,"What's this",11);
*end++ = '\'';
*end++ = ',';
*end++ = '\'';
end += mysql_escape_string(end,"binary data: \0\r\n",16);
*end++ = '\'';
*end++ = ')';
if (mysql_real_query(&mysql,query,(unsigned int) (end - query)))
{
fprintf(stderr, "Failed to insert row, Error: %s\n",
mysql_error(&mysql));
}
例子中所用的strmov()函數(shù)被包括在mysqlclient庫中且功能類似于strcpy(),但是返回一個(gè)指向空終止的第一個(gè)參數(shù)的指針。
20.4.13.3 返回值
放進(jìn)to的值的長度,不包括終止空字符。
20.4.13.4 錯(cuò)誤
無。
20.4.14 mysql_fetch_field()
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
20.4.14.1 說明
返回作為一個(gè)MYSQL_FIELD結(jié)構(gòu)的一個(gè)結(jié)果集合的一個(gè)列的定義。重復(fù)調(diào)用這個(gè)函數(shù)在結(jié)果集合中檢索所有關(guān)于列的信息。當(dāng)沒有剩下更多的字段時(shí),mysql_fetch_field()返回NULL。
在每次你執(zhí)行一個(gè)新的SELECT查詢,mysql_fetch_field()被重置(reset)以返回有關(guān)第一列的信息。由mysql_fetch_field()返回的字段也受調(diào)用mysql_field_seek()的影響。
如果你調(diào)用mysql_query()在一張表上執(zhí)行一個(gè)SELECT,但是
沒調(diào)用mysql_store_result(),如果你調(diào)用mysql_fetch_field()詢問一個(gè)BLOB字段的長度,MySQL返回缺省
BLOB長度(8K字節(jié))。(選擇8K的長度是因?yàn)镸ySQL不知道BLOB的最大長度。這應(yīng)該在某個(gè)時(shí)候是它可配置)
一旦你已經(jīng)檢索了結(jié)果集合,field->max_length包含了在特定查詢中對于該列最大值的長度。
20.4.14.2 返回值
當(dāng)前列的MYSQL_FIELD結(jié)構(gòu)。如果沒有列剩下,NULL。
20.4.14.3 錯(cuò)誤
無。
20.4.14.4 范例
MYSQL_FIELD *field;
while((field = mysql_fetch_field(result)))
{
printf("field name %s\n", field->name);
}
20.4.15 mysql_fetch_fields()
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
20.4.15.1 說明
返回一個(gè)結(jié)果集合的所有MYSQL_FIELD結(jié)構(gòu)的數(shù)組。每個(gè)結(jié)構(gòu)提供結(jié)果結(jié)合中一列的字段定義。
20.4.15.2 返回值
一個(gè)結(jié)果集合的所有MYSQL_FIELD結(jié)構(gòu)的一個(gè)數(shù)組。
20.4.15.3 錯(cuò)誤
無。
20.4.15.4 范例
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields;
num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i
20.4.16 mysql_fetch_field_direct()
MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr)
20.4.16.1 說明
給定在一個(gè)結(jié)果集合中的一個(gè)列的字段編號fieldnr,返回作為MYSQL_FIELD結(jié)構(gòu)的列的字段定義。你可以使用這個(gè)函數(shù)檢索任意列的義。fieldnr的值應(yīng)該在從0到mysql_num_fields(result)-1范圍內(nèi)。
20.4.16.2 返回值
指定列的MYSQL_FIELD結(jié)構(gòu)。
20.4.16.3 錯(cuò)誤
無。
20.4.16.4 范例
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *field;
num_fields = mysql_num_fields(result);
for(i = 0; i name);
}
20.4.17 mysql_fetch_lengths()
unsigned long *mysql_fetch_lengths(MYSQL_RES *result)
20.4.17.1 說明
返回在結(jié)果集合內(nèi)的當(dāng)前行的列長度。如果你計(jì)劃拷貝字段值,這個(gè)長度信息對優(yōu)化也是有用的,因?yàn)槟憧梢员苊庹{(diào)用strlen()。另外,如果結(jié)果集合中包含二進(jìn)制數(shù)據(jù),你必須使用這個(gè)函數(shù)確定數(shù)據(jù)的大小,因?yàn)閟trlen()對包含空字符的任何字段返回不正確的結(jié)果。
空列和包含NULL的列的長度值是零。為了看清如何區(qū)分這兩種情況,見mysql_fetch_row()的說明。
20.4.17.2 返回值
表示每列大小的無符號長整數(shù)的一個(gè)數(shù)組(不包括任何終止空字符)。如果出現(xiàn)一個(gè)錯(cuò)誤,NULL。
20.4.17.3 錯(cuò)誤
mysql_fetch_lengths()只對結(jié)果集合的當(dāng)前行有效。如果你在調(diào)用mysql_fetch_row()之前或在檢索出在結(jié)果中的所有以后,它返回NULL。
20.4.17.4 范例
MYSQL_ROW row;
unsigned long *lengths;
unsigned int num_fields;
unsigned int i;
row = mysql_fetch_row(result);
if (row)
{
num_fields = mysql_num_fields(result);
lengths = mysql_fetch_lengths(result);
for(i = 0; i
20.4.18.1 說明
檢索一個(gè)結(jié)果集合的下一行。當(dāng)在
mysql_store_result()之后使用時(shí),如果沒有更多的行可見所時(shí),mysql_fetch_row()返回NULL。當(dāng)在
mysql_use_result()之后使用時(shí),當(dāng)沒有更多的行可檢索時(shí)或如果出現(xiàn)一個(gè)錯(cuò)誤,mysql_fetch_row()返回NULL。
在行中值的數(shù)量由mysql_num_fields(result)給
出。如果row保存了從一個(gè)對用mysql_fetch_row()調(diào)用返回的值,指向該值的指針作為row[0]到
row[mysql_num_fields(result)-1]來存取。在行中的NULL值由NULL指針指出。
在行中字段值的長度可以通過調(diào)用mysql_fetch_lengths()獲得?兆侄魏桶琋ULL的字段長度都是 0;你可以通過檢查該值的指針區(qū)分他們。如果指針是NULL,字段是NULL;否則字段是空的。
20.4.18.2 返回值
下一行的一個(gè)MYSQL_ROW結(jié)構(gòu)。如果沒有更多的行可檢索或如果出現(xiàn)一個(gè)錯(cuò)誤,NULL。
20.4.18.3 錯(cuò)誤
CR_SERVER_LOST
對服務(wù)器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個(gè)未知的錯(cuò)誤。
20.4.18.4 范例
MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;
num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
unsigned long *lengths;
lengths = mysql_fetch_lengths(result);
for(i = 0; i
如果你正在使用一個(gè)比3.22.24早MySQL版本,你應(yīng)該使用unsigned int mysql_num_fields(MYSQL *mysql)。
20.4.19.1 說明
返回在連接上的最近查詢的列的數(shù)量。
這個(gè)函數(shù)一般用在mysql_store_result()返回NULL時(shí)
(這樣你沒有結(jié)果設(shè)置指針)。在這種情況中,你能調(diào)用mysql_field_count()確定mysql_store_result()是否應(yīng)該產(chǎn)生
了一個(gè)非空的結(jié)果。這允許一個(gè)客戶程序執(zhí)行正確的操作,而不必知道查詢是否是一條SELECT(或類SELECT)語句。下面顯示的例子說明這怎樣可以做
到。
見20.4.51 為什么在mysql_query()返回成功后,mysql_store_result()有時(shí)返回NULL?。
20.4.19.2 返回值
在結(jié)果集合中表示字段數(shù)量字的一個(gè)無符號整數(shù)。
20.4.19.3 錯(cuò)誤
無。
20.4.19.4 范例
MYSQL_RES *result;
unsigned int num_fields;
unsigned int num_rows;
if (mysql_query(&mysql,query_string))
{
// error
}
else // query succeeded, process any data returned by it
{
result = mysql_store_result(&mysql);
if (result) // there are rows
{
num_fields = mysql_num_fields(result);
// retrieve rows, then call mysql_free_result(result)
}
else // mysql_store_result() returned nothing; should it have?
{
if(mysql_field_count(&mysql) == 0)
{
// query does not return data
// (it was not a SELECT)
num_rows = mysql_affected_rows(&mysql);
}
else // mysql_store_result() should have returned data
{
fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}
}
}
另一個(gè)選擇是用mysql_errno(&mysql)代替
mysql_field_count(&mysql)調(diào)用。在這種情況中,你直接檢查來自mysql_store_result()的一個(gè)錯(cuò)誤而
非從mysql_field_count()值來推斷語句是否是一個(gè)SELECT。
20.4.20 mysql_field_seek()
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)
20.4.20.1 說明
將字段光標(biāo)設(shè)置到給定的偏移量。下一次調(diào)用mysql_fetch_field()將檢索與該偏移量關(guān)聯(lián)的列的字段定義。
為了定位于行的起始,傳遞一個(gè)值為0的offset值。
20.4.20.2 返回值
字段光標(biāo)的先前的值。
20.4.20.3 錯(cuò)誤
無。
20.4.21mysql_field_tell()
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)
20.4.21.1 說明
返回用于最后一個(gè)mysql_fetch_field()的字段光標(biāo)的位置。這個(gè)值可用作mysql_field_seek()的一個(gè)參數(shù)。
20.4.21.2 返回值
字段光標(biāo)的當(dāng)前偏移量。
20.4.21.3 錯(cuò)誤
無。
20.4.22 mysql_free_result()
void mysql_free_result(MYSQL_RES *result)
20.4.22.1 說明
釋放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等為一個(gè)結(jié)果集合分配的內(nèi)存。當(dāng)你用完了一個(gè)結(jié)果集合時(shí),你必須調(diào)用mysql_free_result()來釋放它使用的內(nèi)存。
20.4.22.2 返回值
無。
20.4.22.3 錯(cuò)誤
無。
20.4.23 mysql_get_client_info()
char *mysql_get_client_info(void)
20.4.23.1 說明
返回代表客戶庫的版本的字符串。
20.4.23.2 返回值
代表MySQL客戶庫版本的一個(gè)字符串。
20.4.23.3 錯(cuò)誤
無。
20.4.24 mysql_get_host_info()
char *mysql_get_host_info(MYSQL *mysql)
20.4.24.1 說明
返回描述正在使用的連接類型的字符串,包括服務(wù)其主機(jī)名。
20.4.24.2 返回值
表示服務(wù)器主機(jī)名者和連接類型的字符串。
20.4.24.3 錯(cuò)誤
無。
20.4.25 mysql_get_proto_info()
unsigned int mysql_get_proto_info(MYSQL *mysql)
20.4.25.1 說明
返回當(dāng)前連接使用的協(xié)議版本。
20.4.25.2 返回值
表示被當(dāng)前連接使用的協(xié)議版本的一個(gè)無符號整數(shù)。
20.4.25.3 錯(cuò)誤
無。
20.4.26 mysql_get_server_info()
char *mysql_get_server_info(MYSQL *mysql)
20.4.26.1 說明
返回表示服務(wù)器版本號的字符串。
20.4.26.2 返回值
表示服務(wù)器版本號的一個(gè)字符串。
20.4.26.3 錯(cuò)誤
無。
20.4.27 mysql_info()
char *mysql_info(MYSQL *mysql)
20.4.27.1 說明
檢索一個(gè)字符串,它提供有關(guān)最近執(zhí)行的查詢的信息,但是對下面列出的語句。對其他語句,mysql_info()返回NULL。字符串的格式隨查詢類型而變化,如下所述。數(shù)字僅僅是說明性的;字符串將包含對查詢適當(dāng)?shù)闹怠?
INSERT INTO ... SELECT ...
字符串格式: Records: 100 Duplicates: 0 Warnings: 0
INSERT INTO ... valueS (...),(...),(...)...
字符串格式: Records: 3 Duplicates: 0 Warnings: 0
LOAD DATA INFILE ...
字符串格式: Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
ALTER TABLE
字符串繩格式: Records: 3 Duplicates: 0 Warnings: 0
UPDATE
字符串格式: Rows matched: 40 Changed: 40 Warnings: 0
注意,只有多個(gè)值在語句中指定,mysql_info()對INSERT ... valueS語句才返回非NULL值。
20.4.27.2 返回值
表示最近執(zhí)行的查詢的附加信息的一個(gè)字符串。如果得不到查詢的任何信息,NULL。
20.4.27.3 錯(cuò)誤
無。
20.4.28 mysql_init()
MYSQL *mysql_init(MYSQL *mysql)
20.4.28.1 說明
分配或初始化適合
mysql_real_connect()的一個(gè)MYSQL對象。如果mysql是一個(gè)NULL指針,函數(shù)分配、初始化并且返回一個(gè)新對象。否則對象被初
始化并且返回對象的地址。如果mysql_init()分配一個(gè)新對象,它將在調(diào)用mysql_close()關(guān)閉連接時(shí)被釋放。
20.4.28.2 返回值
一個(gè)被初始化的MYSQL*句柄。如果沒有足夠的內(nèi)存來分配一個(gè)新對象,NULL。
20.4.28.3 錯(cuò)誤
在內(nèi)存不夠的情況下,返回NULL。
20.4.29 mysql_insert_id()
my_ulonglong mysql_insert_id(MYSQL *mysql)
20.4.29.1 說明
返回由先前的查詢?yōu)橐粋(gè)AUTO_INCREMENT列生成的ID。在你執(zhí)行一個(gè)INSERT查詢向一個(gè)包含AUTO_INCREMENT字段的表中插入后,使用這個(gè)函數(shù)。
注意,如果先前的查詢不產(chǎn)生一個(gè)AUTO_INCREMENT值,mysql_insert_id()返回0。如果你需要在以后保存該值,必須在查詢生成了該值后馬上調(diào)用mysql_insert_id()。
也要注意,SQL的LAST_INSERT_ID()函數(shù)總是包含最近生成的AUTO_INCREMENT值,并且在查詢之間不被重置,因?yàn)樵摵瘮?shù)的值在服務(wù)器端維護(hù)。
20.4.29.2 返回值
有先前的查詢更新的AUTO_INCREMENT字段的值。如果在連接上沒有先前的詢問或如果查詢沒更新AUTO_INCREMENT值,返回零。
20.4.29.3 錯(cuò)誤
無。
20.4.30 mysql_kill()
int mysql_kill(MYSQL *mysql, unsigned long pid)
20.4.30.1 說明
要求服務(wù)器殺死由pid指定的線程。
20.4.30.2 返回值
成功,零。如果出現(xiàn)一個(gè)錯(cuò)誤,非零。
20.4.30.3 錯(cuò)誤
CR_COMMANDS_OUT_OF_SYNC
命令以一個(gè)不正確的次序被執(zhí)行。
CR_SERVER_GONE_ERROR
MySQL服務(wù)器關(guān)閉了。
CR_SERVER_LOST
對服務(wù)器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個(gè)未知的錯(cuò)誤。
20.4.31 mysql_list_dbs()
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)
20.4.31.1 說明
返回一個(gè)結(jié)果集合,它用在服務(wù)器上的匹配
wild參數(shù)指定的簡單正則表達(dá)式的數(shù)據(jù)庫名組成。wild可以包含通配符字符“%”或“_”,或可以是匹配所有的數(shù)據(jù)庫的一個(gè)NULL指針。調(diào)用
mysql_list_dbs()類似于執(zhí)行查詢SHOW databases [LIKE wild]。
你必須用mysql_free_result()釋放結(jié)果集合。
20.4.31.2 返回值
成功,一個(gè)MYSQL_RES結(jié)果集合。如果出現(xiàn)一個(gè)錯(cuò)誤,NULL。
20.4.31.3 錯(cuò)誤
CR_COMMANDS_OUT_OF_SYNC
命令以一個(gè)不正確的次序被執(zhí)行。
CR_OUT_OF_MEMORY
內(nèi)存溢出。
CR_SERVER_GONE_ERROR
MySQL服務(wù)器關(guān)閉了。
CR_SERVER_LOST
對服務(wù)器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個(gè)未知的錯(cuò)誤。
20.4.32 mysql_list_fields()
MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
20.4.32.1 說明
返回一個(gè)結(jié)果集合,它用在給定表中的匹配
wild參數(shù)指定的簡單正則表達(dá)式的列名組成。wild可以包含通配符字符“%”或“_”,或可以是匹配所有列的一個(gè)NULL指針。調(diào)用
mysql_list_fields()類似于執(zhí)行查詢SHOW COLUMNS FROM tbl_name [LIKE wild]。
注意,建議你使用SHOW COLUMNS FROM tbl_name而不是mysql_list_fields()。
你必須用mysql_free_result()釋放結(jié)果集合。
20.4.32.2 返回值
成功,一個(gè)MYSQL_RES的結(jié)果集合。如果出線一個(gè)錯(cuò)誤,NULL。
20.4.32.3 錯(cuò)誤
CR_COMMANDS_OUT_OF_SYNC
命令以一個(gè)不正確的次序被執(zhí)行。
CR_SERVER_GONE_ERROR
MySQL服務(wù)者關(guān)閉了。
CR_SERVER_LOST
對服務(wù)器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個(gè)未知的錯(cuò)誤。
20.4.33 mysql_list_processes()
MYSQL_RES *mysql_list_processes(MYSQL *mysql)
20.4.33.1 說明
返回一個(gè)描述當(dāng)前服務(wù)器線程的結(jié)果集合。這是與mysqladmin processlist或SHOW PROCESSLIST查詢報(bào)告的相同信息。
你必須用mysql_free_result()釋放結(jié)果集合。
20.4.33.2 返回值
成功,一個(gè)MYSQL_RES結(jié)果集合。如果發(fā)生一個(gè)錯(cuò)誤,NULL。
20.4.33.3 錯(cuò)誤
CR_COMMANDS_OUT_OF_SYNC
命令以一個(gè)不正確的次序被執(zhí)行。
CR_SERVER_GONE_ERROR
MySQL服務(wù)者關(guān)閉了。
CR_SERVER_LOST
對服務(wù)器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個(gè)未知的錯(cuò)誤。
20.4.34 mysql_list_tables()
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)
20.4.34.1 說明
返回一個(gè)結(jié)果集合,它用在當(dāng)前數(shù)據(jù)庫中的匹
配wild參數(shù)指定的簡單正則表達(dá)式的表名組成。wild可以包含通配符字符“%”或“_”,或可以是匹配所有表的一個(gè)NULL指針。調(diào)用
mysql_list_tables()類似于執(zhí)行詢問SHOW tables [LIKE wild]。
你必須用mysql_free_result()釋放結(jié)果集合。
20.4.34.2 返回值
成功,一個(gè)MYSQL_RES結(jié)果集合。如果出現(xiàn)一個(gè)錯(cuò)誤,NULL。
20.4.34.3 錯(cuò)誤
CR_COMMANDS_OUT_OF_SYNC
命令以一個(gè)不正確的次序被執(zhí)行。
CR_SERVER_GONE_ERROR
MySQL服務(wù)器關(guān)閉了。
CR_SERVER_LOST
對服務(wù)器的連接在查詢期間失去。
CR_UNKNOWN_ERROR
發(fā)生一個(gè)未知的錯(cuò)誤。
20.4.35 mysql_num_fields()
unsigned int mysql_num_fields(MYSQL_RES *result)
或
unsigned int mysql_num_fields(MYSQL *mysql)
第二中形式在MySQL 3.22.24或更新版本上不能工作。為了傳遞一個(gè)MYSQL* 參數(shù),你必須使用unsigned int mysql_field_count(MYSQL *mysql)。
20.4.35.1 說明
在結(jié)果集合中返回列的數(shù)量。
注意,你也可以通過一個(gè)指向一個(gè)結(jié)果集合或一個(gè)連接句柄的指針獲得列的數(shù)量。
如果mysql_store_result()或mysql_user_result()返回NULL,你將使用連接句柄(而這樣你沒有結(jié)果集合指針)。
在這種情況下,你可以調(diào)用mysql_field_count()確定mysql_store_result()是否應(yīng)該產(chǎn)生非空的結(jié)果。這允許客戶程序
采取成正確的行動(dòng),不必知道查詢是否是一個(gè)SELECT(或類SELECT)語句。下面被顯示出的例子說明這怎么可以被做。
見20.4.51 為什么在mysql_query()返回成功后,mysql_store_result()有時(shí)返回NULL?。
20.4.35.2 返回值
表示一個(gè)結(jié)果集合中字段數(shù)量的一個(gè)無符號整數(shù)。
20.4.35.3 錯(cuò)誤
無。
20.4.35.4 范例
MYSQL_RES *result;
unsigned int num_fields;
unsigned int num_rows;
if (mysql_query(&mysql,query_string))
{
// error
}
else // query succeeded, process any data returned by it
{
result = mysql_store_result(&mysql);
if (result) // there are rows
{
num_fields = mysql_num_fields(result);
// retrieve rows, then call mysql_free_result(result)
}
else // mysql_store_result() returned nothing; should it have?
{
if (mysql_errno(&mysql))
{
fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}
else if (mysql_field_count(&mysql) == 0)
{
// query does not return data
// (it was not a SELECT)
num_rows = mysql_affected_rows(&mysql);
}
}
}
另一個(gè)選擇(如果你知道你查詢應(yīng)該返回了一個(gè)結(jié)果結(jié)合)是用mysql_field_count(&mysql) = 0的一個(gè)檢查來代替mysql_errno(&mysql)。這只會發(fā)生在出錯(cuò)了的情形。
20.4.36 mysql_num_rows()
my_ulonglong mysql_num_rows(MYSQL_RES *result)
20.4.36.1 說明
在結(jié)果集合中返回行的數(shù)量。
mysql_num_rows()的使用取決于你是否使用
mysql_store_result()或mysql_use_result()返回一個(gè)結(jié)果集合。如果你使用
mysql_store_result(),mysql_num_rows()可以馬上被調(diào)用。如果你使用
mysql_use_result(),mysql_num_rows()將不會返回正確的值,直到在結(jié)果集合中的所有行均被檢索了。
20.4.36.2 返回值
在結(jié)果集合中行的數(shù)量。
20.4.36.3 錯(cuò)誤
無。
20.4.37 mysql_options()
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)
20.4.37.1 說明
能用于設(shè)置額外連接選項(xiàng)并且影響一個(gè)連接的行為。這個(gè)函數(shù)可以被多次調(diào)用來設(shè)置多個(gè)選項(xiàng)。
mysql_options()應(yīng)該在mysql_init()之后和mysql_connect()或mysql_real_connect()之前調(diào)用。
option參數(shù)是你想要設(shè)置的選項(xiàng);arg參數(shù)是選項(xiàng)的值。如果選項(xiàng)是一個(gè)整數(shù),那么arg應(yīng)該指向整數(shù)值。
可能的選項(xiàng)值:
選項(xiàng) 參數(shù)類型 功能
MYSQL_OPT_CONNECT_TIMEOUT unsigned int * 以秒計(jì)的連接超時(shí)。
MYSQL_OPT_COMPRESS 不使用 使用壓縮的客戶機(jī)/服務(wù)器協(xié)議。
MYSQL_OPT_NAMED_PIPE 不使用 使用命名管道連接一個(gè)在NT上的MySQL服務(wù)器。
MYSQL_INIT_COMMAND char * 當(dāng)連接MySQL服務(wù)器時(shí)執(zhí)行的命令。當(dāng)重新連接時(shí),將自動(dòng)重新執(zhí)行。
MYSQL_READ_DEFAULT_FILE char * 從命名的選項(xiàng)文件而不是從“my.cnf”讀取選項(xiàng)。
MYSQL_READ_DEFAULT_GROUP char * 從“my.cnf”或用MYSQL_READ_DEFAULT_FILE指定的文件中的命名組中讀取選項(xiàng)。
注意,如果你使用MYSQL_READ_DEFAULT_FILE或MYSQL_READ_DEFAULT_GROUP,總是讀取client。
在選項(xiàng)文件中指定的組可能包含下列選項(xiàng):
[color="#555555"]compress 使用壓縮的客戶機(jī)/服務(wù)器協(xié)議。
database 如果在連接命令中沒有指定數(shù)據(jù)庫,使用這個(gè)數(shù)據(jù)庫。
debug 調(diào)試選項(xiàng)
host 缺省主機(jī)名
init-command 在連接MySQL服務(wù)器時(shí),執(zhí)行的命令。當(dāng)重新連接時(shí),將自動(dòng)重新執(zhí)行。
password 缺省口令
pipe 使用命名管道連接一個(gè)在NT上的MySQL服務(wù)器。
port 缺省端口號
return-found-rows 告訴mysql_info()返回找到的行,而不是在使用UPDATE時(shí),返回更新的行。
socket 缺省套接字號
timeout 以秒計(jì)的連接超時(shí)。
user 缺省用戶
本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u3/104705/showart_2112405.html |
|