Mysql入門(mén)系列:建立MYSQL客戶(hù)機(jī)程序的一般過(guò)程
; MySQL提供用C編程語(yǔ)言編寫(xiě)的客戶(hù)機(jī)庫(kù),可以用它編寫(xiě)訪問(wèn)MySQL的客戶(hù)機(jī)程序。這個(gè)庫(kù)定義了應(yīng)用程序編程接口,包括下面的實(shí)用程序: ; ■ 建立和終止與服務(wù)器會(huì)話(huà)的連接管理例程。 ; ■ 構(gòu)造查詢(xún)的例程,將例程發(fā)送到服務(wù)器,并處理結(jié)果。 ; ■ 當(dāng)其他C API調(diào)用失敗時(shí),確定錯(cuò)誤準(zhǔn)確原因的狀態(tài)和錯(cuò)誤報(bào)告函數(shù)。 ; 本章介紹如何用客戶(hù)機(jī)庫(kù)編寫(xiě)自己的程序。我們要記住的一些要點(diǎn)是,自己的程序與MySQL分發(fā)包中已有的客戶(hù)機(jī)程序的一致性,代碼的模塊性和可重用性。本章假設(shè)您知道用C編程的一些知識(shí),但并不一定是專(zhuān)家。本章從簡(jiǎn)單到復(fù)雜粗略地開(kāi)發(fā)了一系列的客戶(hù)機(jī)程序。這個(gè)過(guò)程是第一部分開(kāi)發(fā)了一個(gè)程序框架,該框架除了與服務(wù)器連接和斷開(kāi)以外不能作任何事情。這樣做的原因是,盡管MySQL客戶(hù)機(jī)程序是為不同的目的而編寫(xiě)的,但它們都有一個(gè)共同點(diǎn):即創(chuàng)建與服務(wù)器的連接。 ; 我們將用以下步驟來(lái)建立這個(gè)程序框架: ; 1. 編寫(xiě)一些連接和斷開(kāi)的簡(jiǎn)要代碼(客戶(hù)機(jī)程序1)。 ; 2. 增加一些錯(cuò)誤檢查(客戶(hù)機(jī)程序2)。 ; 3. 使連接代碼模塊化和可重用化(客戶(hù)機(jī)程序3)。 ; 4. 增加獲取運(yùn)行時(shí)連接參數(shù)的能力(主機(jī),用戶(hù),口令)(客戶(hù)機(jī)程序4)。 ; 這個(gè)框架一般是合理的,可以使用它作為編寫(xiě)任意數(shù)量的客戶(hù)機(jī)程序的基礎(chǔ)。開(kāi)發(fā)它以后,我們將暫不考慮如何處理各種問(wèn)題。首先,我們將討論如何處理特定的硬編碼的SQL語(yǔ)句,然后再開(kāi)發(fā)用于處理任意語(yǔ)句的代碼。在這之后,將查詢(xún)處理的代碼增加到客戶(hù)機(jī)程序框架中,開(kāi)發(fā)另一個(gè)程序(客戶(hù)機(jī)程序5),它類(lèi)似于mysql客戶(hù)機(jī)程序。我們也將考慮(并解決)一些通用的問(wèn)題,如“如何獲取有關(guān)表的結(jié)構(gòu)信息?”和“如何在數(shù)據(jù)庫(kù)中插入圖像?”只有在需要時(shí),本章才討論客戶(hù)機(jī)庫(kù)的函數(shù)和數(shù)據(jù)類(lèi)型。要想了解所有函數(shù)和類(lèi)型的列表,請(qǐng)參閱附錄F“C API 參考”??梢杂眠@個(gè)附錄作為使用客戶(hù)機(jī)庫(kù)任何部分的進(jìn)一步的背景信息的參考。 ; 樣例程序可以由聯(lián)機(jī)下載得到,可以直接使用,而不必再鍵入它們。有關(guān)的指導(dǎo),請(qǐng)參閱附錄A“獲得和安裝軟件”。 ; 在哪里尋找樣例 ; MySQL郵件清單的一個(gè)共同問(wèn)題就是“我在哪里可以找到一些用C 寫(xiě)的客戶(hù)機(jī)樣例?”。當(dāng)然,這個(gè)答案是“就在本書(shū)里!”。但是,許多人好像并沒(méi)有考慮的是MySQL分發(fā)包中包括了若干客戶(hù)機(jī)程序(例如mysql、mysqladmin 和mysqldump),這些大部分都是用C編寫(xiě)的。因?yàn)檫@個(gè)分發(fā)包可以很容易地以源程序形式使用,所以MySQL提供非常少的樣例客戶(hù)機(jī)代碼。因此,如果您還沒(méi)有這樣做,找個(gè)時(shí)間找到源程序分發(fā)包,在客戶(hù)機(jī)目錄中查看這些程序。MySQL客戶(hù)機(jī)程序?yàn)楣蚕碥浖瑥哪抢锟梢詾樽约旱某绦蜃杂傻亟栌么a。 ; 在本章提供的樣例和MySQL分發(fā)包中包括的客戶(hù)機(jī)程序之間,可以找到與自己編寫(xiě)程序時(shí)想做的事情相類(lèi)似的代碼。如果是這樣,可以通過(guò)拷貝和修改已有的程序來(lái)重新使用代碼。應(yīng)該閱讀本章,了解客戶(hù)機(jī)庫(kù)是如何工作的。然而,請(qǐng)記住,并不總是需要自己編寫(xiě)瑣碎的每件事情(您將注意到,在本章編寫(xiě)程序的討論中,代碼的可重用性是目的之一)。通過(guò)使用其他人編好的程序,可以避免許多工作,那是最好的。 ; 6.1建立客戶(hù)機(jī)程序的一般過(guò)程 ; 本節(jié)介紹使用MySQL客戶(hù)機(jī)庫(kù)編譯和連接程序所包括的步驟。不同的系統(tǒng)建立客戶(hù)機(jī)程序的命令也有所不同,可能需要稍微修改一下這里介紹的命令。然而,這里的說(shuō)明是通用的,應(yīng)該能夠?qū)⑺糜趲缀跄帉?xiě)的任何客戶(hù)機(jī)程序中。 ; 6.1.1基本的系統(tǒng)需求 ; 當(dāng)您用C 編寫(xiě)MySQL客戶(hù)程序時(shí),顯然將需要一個(gè)C 編譯程序。這里說(shuō)明的樣例使用gcc。除了自己的源文件以外,還將需要下列程序: ; ■ MySQL頭文件。 ; ■ MySQL客戶(hù)機(jī)庫(kù)。 ; MySQL頭文件和客戶(hù)機(jī)庫(kù)組成客戶(hù)機(jī)編程的支持程序。它們可能已經(jīng)安裝到您的系統(tǒng)上。如果沒(méi)有,應(yīng)獲取它們。如果MySQL從源程序分發(fā)包或二進(jìn)制分發(fā)包中安裝,則客戶(hù)機(jī)可編程的支持程序應(yīng)該已經(jīng)作為該處理的一部分安裝了。如果MySQL是從RPM 文件中安裝的,則除非安裝了開(kāi)發(fā)程序R P M,否則就沒(méi)有這種支持。如果需要安裝MySQL頭文件和庫(kù),請(qǐng)參閱附錄A。 ; 6.1.2 編譯和連接客戶(hù)機(jī)程序 ; 要想編譯和連接客戶(hù)機(jī)程序,就必須指定MySQL頭文件和客戶(hù)機(jī)庫(kù)的位置,因?yàn)樗鼈兺ǔ2话惭b在編譯程序和連接程序缺省搜索的位置。對(duì)于下面的樣例,假定頭文件和客戶(hù)機(jī)庫(kù)的位置為/usr/local/include/mysql和/ usr / local / lib / mysql。要想告知編譯程序如何尋找MySQL頭文件,則當(dāng)將源文件編譯為目標(biāo)文件時(shí),傳送給它一個(gè)-I/usr/local/include/mysql參數(shù)。例如,可以使用這樣的命令: 要想告知連接程序在哪,可以找到客戶(hù)機(jī)庫(kù)和它的名稱(chēng),當(dāng)連接目標(biāo)文件產(chǎn)生一個(gè)可執(zhí)行的二進(jìn)制文件時(shí),傳送-L/usr/local/lib/mysql和-lmysqlclient 參數(shù),如下所示:
如果客戶(hù)機(jī)程序包括多個(gè)文件,則所有目標(biāo)文件的名稱(chēng)都要列在連接命令上。如果連接步驟導(dǎo)致不能找到必需的floor() 函數(shù)的錯(cuò)誤,則通過(guò)在命令行的后面增加- l m,連接到數(shù)學(xué)庫(kù):
可能還需要增加其他的庫(kù)。例如,在Solaris 上可能需要-lsocket -lnsl。 ; 如果沒(méi)有使用make 建立程序,則建議您了解一下如何進(jìn)行,以便不必手工地鍵入許多建立程序的命令。假設(shè)有一個(gè)客戶(hù)機(jī)程序myclient,包括兩個(gè)源文件main.c 和aux.c,及一個(gè)頭文件myclient.h。一個(gè)簡(jiǎn)單的Makefile 建立這個(gè)程序的代碼,如下所示:
如果是一個(gè)需要連接到數(shù)學(xué)庫(kù)的系統(tǒng),則更改LIBS 的值,并將-lm 加到最后:LIBS = -L/usr/local/lib/mysql-lmysqlclient -lm如果需要其他的庫(kù),如-lsocket 和- l n s l,則也要將這些庫(kù)加到LIBS 中。使用M a k e f i l e,無(wú)論何時(shí)修改何源文件,只簡(jiǎn)單地鍵入“ m a k e”就可以重新建立程序代碼。那比鍵入一句長(zhǎng)的gcc 命令更容易,發(fā)生錯(cuò)誤更少。
