【正文】
groups)。 one = db_connect(test)。 two = db_connect(NULL)。 db_do_query(one, SHOW TABLE STATUS)。 db_do_query(two, SHOW DATABASES)。 mysql_close(two)。 mysql_close(one)。 /* This must be called after all other mysql functions */ mysql_server_end()。 exit(EXIT_SUCCESS)。}static voiddie(MYSQL *db, char *fmt, ...){ va_list ap。 va_start(ap, fmt)。 vfprintf(stderr, fmt, ap)。 va_end(ap)。 (void)putc(39。\n39。, stderr)。 if (db) db_disconnect(db)。 exit(EXIT_FAILURE)。}MYSQL *db_connect(const char *dbname){ MYSQL *db = mysql_init(NULL)。 if (!db) die(db, mysql_init failed: no memory)。 /* * Notice that the client and server use separate group names. * This is critical, because the server does not accept the * client39。s options, and vice versa. */ mysql_options(db, MYSQL_READ_DEFAULT_GROUP, test2_libmysqld_CLIENT)。 if (!mysql_real_connect(db, NULL, NULL, NULL, dbname, 0, NULL, 0)) die(db, mysql_real_connect failed: %s, mysql_error(db))。 return db。}voiddb_disconnect(MYSQL *db){ mysql_close(db)。}voiddb_do_query(MYSQL *db, const char *query){ if (mysql_query(db, query) != 0) goto err。 if (mysql_field_count(db) 0) { MYSQL_RES *res。 MYSQL_ROW row, end_row。 int num_fields。 if (!(res = mysql_store_result(db))) goto err。 num_fields = mysql_num_fields(res)。 while ((row = mysql_fetch_row(res))) { (void)fputs( , stdout)。 for (end_row = row + num_fields。 row end_row。 ++row) (void)printf(%s\t, row ? (char*)*row : NULL)。 (void)fputc(39。\n39。, stdout)。 } (void)fputc(39。\n39。, stdout)。 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)。}GNUmakefile This assumes the MySQL software is installed in /usr/local/mysqlinc := /usr/local/mysql/include/mysqllib := /usr/local/mysql/lib If you have not installed the MySQL software yet, try this insteadinc := $(HOME)/lib := $(HOME)/CC := gccCPPFLAGS := I$(inc) D_THREAD_SAFE D_REENTRANTCFLAGS := g W WallLDFLAGS := static You can change lmysqld to lmysqlclient to use the client/server libraryLDLIBS = L$(lib) lmysqld lz lm lcryptifneq (,$(shell grep FreeBSD /COPYRIGHT 2/dev/null)) FreeBSDLDFLAGS += pthreadelse Assume LinuxLDLIBS += lpthreadendif This works for simple onefile test programssources := $(wildcard *.c)objects := $(patsubst %c,%o,$(sources))targets := $(basename $(sources))all: $(targets)clean: rm f $(targets) $(objects) *.core.嵌入式服務(wù)器的許可我們鼓勵(lì)所有人在GPL或兼容許可的旗幟下通過發(fā)布代碼來推廣免費(fèi)軟件。對(duì)于有能力完成該類事項(xiàng)的人員,也可以選擇從MySQL AB購買MySQL的商用許可。詳情請(qǐng)參見。.MySQL C API. C API數(shù)據(jù)類型. C API函數(shù)概述. C API函數(shù)描述. C API預(yù)處理語句. C API預(yù)處理語句的數(shù)據(jù)類型. C API預(yù)處理語句函數(shù)概述. C API預(yù)處理語句函數(shù)描述. C API預(yù)處理語句方面的問題. 多查詢執(zhí)行的C API處理. 日期和時(shí)間值的C API處理. C API線程函數(shù)介紹. C API嵌入式服務(wù)器函數(shù)介紹. 使用C API時(shí)的常見問題. 創(chuàng)建客戶端程序. 如何生成線程式客戶端C API代碼是與MySQL一起提供的。它包含在mysqlclient庫中,并允許C程序訪問數(shù)據(jù)庫。MySQL源碼分發(fā)版的很多客戶端是用C語言編寫的。如果你正在尋找能演示如何使用C API的示例,可參看這些客戶端程序。你可以在MySQL源碼分發(fā)版的客戶端目錄下找到它們。大多數(shù)其他客戶端API(除了Connector/J和Connector/NET)采用mysqlclient庫來與MySQL服務(wù)器進(jìn)行通信。這意味著(例如),你可以利用很多相同環(huán)境變量(與其他客戶端程序使用的環(huán)境變量相同)帶來的好處,這是因?yàn)樗鼈兪菑膸熘幸玫摹jP(guān)于這些變量的詳細(xì)清單,請(qǐng)參見第8章:客戶端和實(shí)用工具程序??蛻舳司哂凶畲蟮耐ㄐ啪彌_區(qū)大小。初始分配的緩沖區(qū)大?。?6KB)將自動(dòng)增加到最大(最大為16MB)。由于緩沖區(qū)大小將按需增加,簡單地增加默認(rèn)的最大限制,從其本身來說不會(huì)增加資源使用。該大小檢查主要是檢查錯(cuò)誤查詢和通信信息包。通信緩沖區(qū)必須足夠大,足以包含1條SQL語句(用于客戶端服務(wù)器通信)以及1行返回的數(shù)據(jù)(用于服務(wù)器客戶端通信)。每個(gè)線程的通信緩沖區(qū)將動(dòng)態(tài)增加,以處理直至最大限制的任何查詢或行。例如,如果BLOB值包含高達(dá)16MB的數(shù)據(jù),那么通信緩沖區(qū)的大小限制至少為16MB(在服務(wù)器和客戶端)??蛻舳说哪J(rèn)最大值為16MB,但服務(wù)器的默認(rèn)最大值為1MB。也可以在啟動(dòng)服務(wù)器時(shí),通過更改max_allowed_packet參數(shù)的值增加它。,“調(diào)節(jié)服務(wù)器參數(shù)”。每次查詢后,MySQL服務(wù)器會(huì)將通信緩沖區(qū)的大小降至net_buffer_length字節(jié)。對(duì)于客戶端,不會(huì)降低與連接相關(guān)緩沖區(qū)大小,直至連接關(guān)閉為止,此時(shí),客戶端內(nèi)存將被收回。關(guān)于使用線程的編程方法,“如何生成線程式客戶端”。關(guān)于在相同程序創(chuàng)建包含“服務(wù)器”和“客戶端”的獨(dú)立應(yīng)用程序的更多信息(不與外部MySQL服務(wù)器通信),“l(fā)ibmysqld,嵌入式MySQL服務(wù)器庫”。.C API數(shù)據(jù)類型 MYSQL 該結(jié)構(gòu)代表1個(gè)數(shù)據(jù)庫連接的句柄。幾乎所有的MySQL函數(shù)均使用它。不應(yīng)嘗試拷貝MYSQL結(jié)構(gòu)。不保證這類拷貝結(jié)果會(huì)有用。 MYSQL_RES 該結(jié)構(gòu)代表返回行的查詢結(jié)果(SELECT, SHOW, DESCRIBE, EXPLAIN)。在本節(jié)的剩余部分,將查詢返回的信息稱為“結(jié)果集”。 MYSQL_ROW 這是1行數(shù)據(jù)的“類型安全”表示。它目前是按照計(jì)數(shù)字節(jié)字符串的數(shù)組實(shí)施的。(如果字段值可能包含二進(jìn)制數(shù)據(jù),不能將其當(dāng)作由Null終結(jié)的字符串對(duì)待,這是因?yàn)檫@類值可能會(huì)包含Null字節(jié))。行是通過調(diào)用mysql_fetch_row()獲得的。 MYSQL_FIELD 該結(jié)構(gòu)包含關(guān)于字段的信息,如字段名、類型和大小。這里詳細(xì)介紹了其成員。通過重復(fù)調(diào)用mysql_fetch_field(),可為每個(gè)字段獲得MYSQL_FIELD結(jié)構(gòu)。字段值不是該結(jié)構(gòu)的組成部份,它們包含在MYSQL_ROW結(jié)構(gòu)中。 MYSQL_FIELD_OFFSET 這是MySQL字段列表偏移量的“類型安全”表示(由mysql_field_seek()使用)。偏移量是行內(nèi)的字段編號(hào),從0開始。 my_ulonglong 用于行數(shù)以及mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()的類型。該類型提供的范圍為0~。 在某些系統(tǒng)上,不能打印類型my_ulonglong的值。要想打印這類值,請(qǐng)將其轉(zhuǎn)換為無符號(hào)長整數(shù)類型并使用%lu打印格式,例如:printf (Number of rows: %lu\n, (unsigned long) mysql_num_rows(result))。下面列出了MYSQL_FIELD結(jié)構(gòu)包含的成員: char * name 字段名稱,由Null終結(jié)的字符串。如果用AS子句為該字段指定了別名,名稱的值也是別名。 char * org_name 段名稱,由Null終結(jié)的字符串。忽略別名。 char * table 包含該字段的表的名稱,如果該字段不是計(jì)算出的字段的話。對(duì)于計(jì)算出的字段,表值為空的字符串。如果用AS子句為該表指定了別名,表的值也是別名。 char * org_table 表的名稱,由Null終結(jié)的字符串。忽略別名。 char * db 字段源自的數(shù)據(jù)的名稱,由Null終結(jié)的字符串。如果該字段是計(jì)算出的字段,db為空的字符串。 char * catalog catalog名稱。該值總是def。 char * def 該字段的默認(rèn)值,由Null終結(jié)的字符串。僅當(dāng)使用mysql_list_fields()時(shí)才設(shè)置它。 unsigned long length 字段的寬度,如表定義中所指定的那樣。 unsigned long max_length 用于結(jié)果集的字段的最大寬度(對(duì)于實(shí)際位于結(jié)果集中的行,最長字段值的長度)。如果使用mysql_store_result()或mysql_list_fields(),它將包含字段的最大長度。如果使用mysql_use_result(),該變量的值為0。 unsigned int name_length 名稱的長度。 unsigned int org_name_length org_name的長度。 unsigned int table_length 表的長度。160