欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
MySQL數據庫技術(shù)(32)
破釜沉舟 http://www.7880.com
MySQL數據庫技術(shù)(32)
文章類(lèi)別:MySQL  發(fā)表日期:2005-09-27     
閱讀次數: 305
6.4 客戶(hù)機程序3—產(chǎn)生連接代碼模塊
對于我們的第三個(gè)客戶(hù)機程序,即客戶(hù)機程序3,通過(guò)將它封裝到函數do_connect() 和do_disconnect() 中,將使連接和斷開(kāi)代碼更加模塊化,這樣可以很容易地由多個(gè)客戶(hù)機程序使用。這提供一種選擇,可將連接代碼精確地嵌入到main() 函數中。無(wú)論如何,對在應用程序過(guò)程中套用老調的任何代碼都是一個(gè)好主意。將它放在可以通過(guò)多個(gè)程序訪(fǎng)問(wèn)的函數中,而不是在每個(gè)程序中都編寫(xiě)一遍。如果修正這個(gè)函數中的一個(gè)錯誤或對這個(gè)函數作了一些改進(jìn),則可只更改一次,只要重新編譯就可以使用這個(gè)函數的所有程序都被修正或利用這種改進(jìn)。同樣,編寫(xiě)一些客戶(hù)機程序,以便在它們執行過(guò)程中可以若干次地連接和斷開(kāi)。如果將安裝和卸載方法放在連接和斷開(kāi)的函數中,則編寫(xiě)這樣一個(gè)客戶(hù)機更加容易。封裝策略如下所示:
1) 將公用代碼分離到一個(gè)獨立的源文件( common.c)的包裝函數中。
2) 提供一個(gè)頭文件,common.h,其中包括該公共例程的原型。
3) 在使用公共例程的客戶(hù)機源文件中包括common.h。
4) 將公共源文件編譯成目標文件。
5) 將公共目標文件連接到您的客戶(hù)機程序中。
用這些策略,讓我們構造do_connect() 和do _ disconnect( )。
do_connect() 代替對mysql_init() 和mysql_real_connect() 的調用,并替換錯誤打印的代碼。除了不傳遞任何連接處理程序外,您可以像mysql_real_connect() 一樣調用它。do_connect() 分配并初始化這個(gè)處理程序,然后,在連接后返回一個(gè)指向它的指針。如果do_ connect() 失敗,則在打印一個(gè)錯誤消息以后,返回N U L L(那就是說(shuō),調用do_connect() 并獲取返回值N U L L的任何程序都可以簡(jiǎn)單地退出,而不用擔心打印消息的本身)。do_ disconnect () 產(chǎn)生一個(gè)指向連接處理程序的指針,并調用mysql_close ()。這里是common.c 的代碼:
common.h 聲明common.c 中這些例程的原型:
要想訪(fǎng)問(wèn)公共例程,應在源文件中包括common.h。請注意, common.c 同樣包括common.h。那就是說(shuō),如果common.c 中的函數定義與頭文件中的聲明不匹配,則立即得到一個(gè)編譯程序警告。同樣,如果更改common.c 中的調用次序而沒(méi)有相應地更改common.h,則當重新編譯common.c 時(shí),編譯程序將發(fā)出警告。
有人會(huì )問(wèn)為什么要發(fā)明包裝函數do _ disconnect( ),而它使用得還這么少。do _ disconnect( )和mysql_close() 等價(jià)。但是假設在斷開(kāi)連接時(shí),都有一些要執行的額外清除。則通過(guò)調用已經(jīng)完全控制的包裝函數,可以修改該包裝函數來(lái)做需要的事情,對于所做的任何斷開(kāi)的操作,這種更改統一生效。如果直接調用mysql _ close( ),則不能做到這點(diǎn)。在前面,筆者聲稱(chēng)對在多個(gè)程序中或在單個(gè)程序內部多處使用的函數中,將代碼封裝成模塊化代碼是有好處的。前面介紹一個(gè)理由,還有一些理由參見(jiàn)下面的兩個(gè)樣例。
■ 樣例1 在MySQL3 .22以前的版本中,mysql_real_connect() 調用與它現在稍微有些不同:即沒(méi)有數據庫名稱(chēng)參數。如果想利用舊的MySQL 客戶(hù)機庫使用do _ connect( ),則它不能工作。然而,可以修改do _ connect( ),使它可在3.22版以前的版本上運行。這就
意味著(zhù),通過(guò)修改do _ connect( ),可以增加使用它的所有程序的可移植性。如果將這些連接代碼直接嵌入到每個(gè)客戶(hù)機中,則必須獨立地修改它們中的每一個(gè)。
要想修正do _ connect( ),使它可以處理mysql_real_connect() 的舊格式,那么就可以使用包括當前MySQL 版本MySQL_VERSION_ID 宏。更改了的do_connect() 測試MySQL_VERSION_ID 值,并使用mysql_real_connect() 的正確格式:
除了下述兩點(diǎn)以外, do_connect() 的這個(gè)修改過(guò)的版本和前一個(gè)版本在外觀(guān)上是完全一樣的:
■ 它不將db_name 參數傳遞給mysql_real_connect() 較早的格式,因為那個(gè)版本沒(méi)有這樣的參數。
■ 如果數據庫名稱(chēng)是非NULL 的,則do_connect() 調用mysql_select_db() 使指定的數據庫為當前數據庫(這類(lèi)似于沒(méi)有db_name 參數的效果)。如果沒(méi)有選擇這個(gè)數據庫,則do_connect() 打印一個(gè)錯誤消息,關(guān)閉連接,并返回NULL 來(lái)表示失敗。
■ 樣例2 該樣例是在對第一個(gè)樣例的do_connect() 做更改的基礎上建立的。那些更改導致對錯誤函數mysql_errno() 和mysql_error() 的三組調用。每次都將報告問(wèn)題的這些代碼書(shū)寫(xiě)出來(lái)是非常討厭的。除此之外,錯誤所打印出的代碼看起來(lái)不舒服,讀起
來(lái)也困難。而讀下面這樣的代碼就比較容易:
print_error (conn, “mysql_real_connect() failed”) ;所以,讓我們在print_error() 函數中封裝錯誤打印。即使conn 為N U L L,也可以編寫(xiě)它來(lái)做一些明智的事情。也就是說(shuō),如果mysql_init() 調用失敗,可以使用print _error( )。而且沒(méi)有混合調用(一些為fprintf ( ),一些為print _ error( ))。我聽(tīng)到一些反對意見(jiàn):“為了想報告一個(gè)錯誤而又不必每次都調用兩個(gè)錯誤函數,所以使代碼故意編寫(xiě)得難以閱讀,以說(shuō)明封裝樣例更好。其實(shí)不用真的寫(xiě)出所有的錯誤打印代碼:只將它編寫(xiě)一次,然后當再次需要時(shí)就使用拷貝和粘貼即可。”這種觀(guān)點(diǎn)是正確的,但我持反對意見(jiàn),理由如下:
■ 即使使用拷貝和粘貼,用較短的代碼段進(jìn)行起來(lái)也更容易。
■ 每當報告錯誤時(shí),無(wú)論是否愿意每次調用兩種函數,將所有的錯誤報告代碼書(shū)寫(xiě)得很長(cháng),會(huì )產(chǎn)生不一致性。將錯誤報告的代碼放在容易調用的包裝函數中,就可以減少這種想法并提高編碼的一致性。
■ 如果決定修改錯誤消息的格式,則只需要在一個(gè)地方而不是整個(gè)程序中做更改,這樣就要容易許多?;蛘?,如果決定將錯誤消息編寫(xiě)到日志文件中而不是(或除此以外還)編寫(xiě)到stderr 中,則只須更改print _ error ( ),這就更容易。這種方法可能犯更少的錯誤,而且再一次減少了工作量和不一致的可能性。
■ 當測試程序時(shí),如果使用調試程序,將斷點(diǎn)放在錯誤報告的函數中,則當它偵測出一個(gè)錯誤條件時(shí),調試程序是使程序中斷的一種便利方法。以下是錯誤報告函數print _ error( )的使用舉例:
主源文件client3.c 與client2.c 一樣,但是所有嵌入的連接和斷開(kāi)代碼都利用調用包裝函數來(lái)刪除和替換了。如下所示:
破釜沉舟 http://www.7880.com
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
MySQL數據庫介紹
JAVA高級編程序——JDBC(連接mysql數據庫)——(一)
Python裝飾器decorator的簡(jiǎn)易教程
用JSTL實(shí)現JSP應用程序快速開(kāi)發(fā)
PHP刪除MYSQL數據庫中所有表的代碼
(轉載)PHP大批量插入數據庫的3種方法和速度對比
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久