ADO程序員參考教程_第1頁(yè)
ADO程序員參考教程_第2頁(yè)
ADO程序員參考教程_第3頁(yè)
ADO程序員參考教程_第4頁(yè)
ADO程序員參考教程_第5頁(yè)
已閱讀5頁(yè),還剩73頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

ADO程序員參考教程MicrosoftADO程序員參考Microsoft?ActiveX?DataObjects(ADO)使您能夠編寫通過(guò)OLEDB提供者對(duì)在數(shù)據(jù)庫(kù)服務(wù)器中的數(shù)據(jù)進(jìn)行訪問(wèn)和操作的應(yīng)用程序。其主要優(yōu)點(diǎn)是易于使用、高速度、低內(nèi)存支出和占用磁盤空間較少。ADO支持用于建立基于客戶端/服務(wù)器和Web的應(yīng)用程序的主要功能。ADO同時(shí)具有遠(yuǎn)程數(shù)據(jù)服務(wù)(RDS)功能,通過(guò)RDS可以在一次往返過(guò)程中實(shí)現(xiàn)將數(shù)據(jù)從服務(wù)器移動(dòng)到客戶端應(yīng)用程序或Web頁(yè)、在客戶端對(duì)數(shù)據(jù)進(jìn)行處理然后將更新結(jié)果返回服務(wù)器的操作。RDS以前的版本是MicrosoftRemoteDataService1.5,現(xiàn)在,RDS已經(jīng)與ADO編程模型合并,以便簡(jiǎn)化客戶端數(shù)據(jù)的遠(yuǎn)程操作。ADO入門本地?cái)?shù)據(jù)訪問(wèn)的解決方案問(wèn)題您需要的是簡(jiǎn)單、一致的應(yīng)用程序編程接口(API),使應(yīng)用程序能夠訪問(wèn)和修改各種各樣的數(shù)據(jù)源。數(shù)據(jù)源可能象文本文件一樣簡(jiǎn)單,也可能象一堆異構(gòu)數(shù)據(jù)庫(kù)那樣復(fù)雜,或者是尚未定型的某種數(shù)據(jù)。此外,API不應(yīng)該預(yù)先設(shè)定訪問(wèn)和操作數(shù)據(jù)源的方式。雖然提出了這些要求,典型的數(shù)據(jù)源依然需要支持開(kāi)放式數(shù)據(jù)庫(kù)連接(ODBC)標(biāo)準(zhǔn)的關(guān)系型數(shù)據(jù)庫(kù),并可通過(guò)用結(jié)構(gòu)化查詢語(yǔ)言(SQL)編寫的命令對(duì)它進(jìn)行操作。Microsoft對(duì)該問(wèn)題提供的總體解決方案是OLEDB,這是一套組件對(duì)象模型(COM)接口,可提供對(duì)存儲(chǔ)在不同信息源進(jìn)行統(tǒng)一訪問(wèn)的能力。但是OLEDB應(yīng)用程序編程接口的設(shè)計(jì)目的是為了為多種多樣的應(yīng)用程序提供優(yōu)化功能,它無(wú)法滿足對(duì)簡(jiǎn)單化的要求。您需要的API應(yīng)該是一座連接應(yīng)用程序和OLEDB的橋梁,這就是ActiveX?DataObjects(ADO)。解決方案ADO定義編程模型,即訪問(wèn)和更新數(shù)據(jù)源所必需的活動(dòng)順序。編程模型概括了ADO的全部功能。編程模型意味著對(duì)象模型,即響應(yīng)并執(zhí)行編程模型的“對(duì)象”組。對(duì)象擁有“方法”,方法執(zhí)行對(duì)數(shù)據(jù)進(jìn)行的操作;對(duì)象擁有“屬性”,屬性指示數(shù)據(jù)的某些特性或控制某些對(duì)象方法的行為。與對(duì)象關(guān)聯(lián)的是“事件”,事件是某些操作已經(jīng)發(fā)生或?qū)⒁l(fā)生的通知?;镜腁DO編程模型ADO提供執(zhí)行以下操作的方式:連接到數(shù)據(jù)源。同時(shí),可確定對(duì)數(shù)據(jù)源的所有更改是否已成功或沒(méi)有發(fā)生。指定訪問(wèn)數(shù)據(jù)源的命令,同時(shí)可帶變量參數(shù),或優(yōu)化執(zhí)行。執(zhí)行命令。如果這個(gè)命令使數(shù)據(jù)按表中的行的形式返回,則將這些行存儲(chǔ)在易于檢查、操作或更改的緩存中。適當(dāng)情況下,可使用緩存行的更改內(nèi)容來(lái)更新數(shù)據(jù)源。提供常規(guī)方法檢測(cè)錯(cuò)誤(通常由建立連接或執(zhí)行命令造成)。在典型情況下,需要在編程模型中采用所有這些步驟。但是,由于ADO有很強(qiáng)的靈活性,所以最后只需執(zhí)行部分模塊就能做一些有用的工作。例如:將數(shù)據(jù)從文件直接存儲(chǔ)到緩存行,然后僅用ADO資源對(duì)數(shù)據(jù)進(jìn)行檢查。ADO編程模型詳細(xì)資料以下元素是ADO編程模型中的關(guān)鍵部分:連接命令參數(shù)記錄集字段錯(cuò)誤屬性集合事件連接通過(guò)“連接”可從應(yīng)用程序訪問(wèn)數(shù)據(jù)源,連接是交換數(shù)據(jù)所必需的環(huán)境。通過(guò)如Microsoft?InternetInformationServer作為媒介,應(yīng)用程序可直接(有時(shí)稱為雙層系統(tǒng))或間接(有時(shí)稱為三層系統(tǒng))訪問(wèn)數(shù)據(jù)源。對(duì)象模型使用Connection對(duì)象使連接概念得以具體化?!笆聞?wù)”用于界定在連接過(guò)程中發(fā)生的一系列數(shù)據(jù)訪問(wèn)操作的開(kāi)始和結(jié)束。ADO可明確事務(wù)中的操作造成的對(duì)數(shù)據(jù)源的更改或者成功發(fā)生,或者根本沒(méi)有發(fā)生。如果取消事務(wù)或它的一個(gè)操作失敗,則最終的結(jié)果將仿佛是事務(wù)中的操作均未發(fā)生,數(shù)據(jù)源將會(huì)保持事務(wù)開(kāi)始以前的狀態(tài)。對(duì)象模型無(wú)法清楚地體現(xiàn)出事務(wù)的概念,而是用一組Connection對(duì)象方法來(lái)表示。ADO訪問(wèn)來(lái)自O(shè)LEDB提供者的數(shù)據(jù)和服務(wù)。Connection對(duì)象用于指定專門的提供者和任意參數(shù)。例如,可對(duì)遠(yuǎn)程數(shù)據(jù)服務(wù)(RDS)進(jìn)行顯式調(diào)用,或通過(guò)“MicrosoftOLEDBRemotingProvider”進(jìn)行隱式調(diào)用。(請(qǐng)參閱RDS教程通過(guò)“MSRemoteProvider”調(diào)用RDS第二步的范例)命令通過(guò)已建立的連接發(fā)出的“命令”可以某種方式來(lái)操作數(shù)據(jù)源。一般情況下,命令可以在數(shù)據(jù)源中添加、刪除或更新數(shù)據(jù),或者在表中以行的格式檢索數(shù)據(jù)。對(duì)象模型用Command對(duì)象來(lái)體現(xiàn)命令概念。Command對(duì)象使ADO能夠優(yōu)化對(duì)命令的執(zhí)行。參數(shù)通常,命令需要的變量部分即“參數(shù)”可以在命令發(fā)布之前進(jìn)行更改。例如,可重復(fù)發(fā)出相同的數(shù)據(jù)檢索命令,但每一次均可更改指定的檢索信息。參數(shù)對(duì)執(zhí)行其行為類似函數(shù)的命令非常有用,這樣就可知道命令是做什么的,但不必知道它如何工作。例如,可發(fā)出一項(xiàng)銀行過(guò)戶命令,從一方借出貸給另一方。可將要過(guò)戶的款額設(shè)置為參數(shù)。對(duì)象模型用Parameter對(duì)象來(lái)體現(xiàn)參數(shù)概念。記錄集如果命令是在表中按信息行返回?cái)?shù)據(jù)的查詢(行返回查詢),則這些行將會(huì)存儲(chǔ)在本地。對(duì)象模型將該存儲(chǔ)體現(xiàn)為Recordset對(duì)象。但是,不存在僅代表單獨(dú)一個(gè)Recordset行的對(duì)象。記錄集是在行中檢查和修改數(shù)據(jù)最主要的方法。Recordset對(duì)象用于:指定可以檢查的行。移動(dòng)行。指定移動(dòng)行的順序。添加、更改或刪除行。通過(guò)更改行更新數(shù)據(jù)源。管理Recordset的總體狀態(tài)。字段一個(gè)記錄集行包含一個(gè)或多個(gè)“字段”。如果將記錄集看作二維網(wǎng)格,字段將排列構(gòu)成“列”。每一字段(列)都分別包含有名稱、數(shù)據(jù)類型和值的屬性,正是在該值中包含了來(lái)自數(shù)據(jù)源的真實(shí)數(shù)據(jù)。對(duì)象模型以Field對(duì)象體現(xiàn)字段。要修改數(shù)據(jù)源中的數(shù)據(jù),可在記錄集行中修改Field對(duì)象的值,對(duì)記錄集的更改最終被傳送給數(shù)據(jù)源。作為選項(xiàng),Connection對(duì)象的事務(wù)管理方法能夠可靠地保證更改要么全部成功,要么全部失敗。錯(cuò)誤錯(cuò)誤隨時(shí)可在應(yīng)用程序中發(fā)生,通常是由于無(wú)法建立連接、執(zhí)行命令或?qū)δ承顟B(tài)(例如,試圖使用沒(méi)有初始化的記錄集)的對(duì)象進(jìn)行操作。對(duì)象模型以Error對(duì)象體現(xiàn)錯(cuò)誤。任意給定的錯(cuò)誤都會(huì)產(chǎn)生一個(gè)或多個(gè)Error對(duì)象,隨后產(chǎn)生的錯(cuò)誤將會(huì)放棄先前的Error對(duì)象組。屬性每個(gè)ADO對(duì)象都有一組唯一的“屬性”來(lái)描述或控制對(duì)象的行為。屬性有兩種類型:內(nèi)置和動(dòng)態(tài)。內(nèi)置屬性是ADO對(duì)象的一部分并且隨時(shí)可用。動(dòng)態(tài)屬性則由特別的數(shù)據(jù)提供者添加到ADO對(duì)象的屬性集合中,僅在提供者被使用時(shí)才能存在。對(duì)象模型以Property對(duì)象體現(xiàn)屬性。集合ADO提供“集合”,這是一種可方便地包含其他特殊類型對(duì)象的對(duì)象類型。使用集合方法可按名稱(文本字符串)或序號(hào)(整型數(shù))對(duì)集合中的對(duì)象進(jìn)行檢索。ADO提供四種類型的集合:Connection對(duì)象具有Errors集合,包含為響應(yīng)與數(shù)據(jù)源有關(guān)的單一錯(cuò)誤而創(chuàng)建的所有Error對(duì)象。Command對(duì)象具有Parameters集合,包含應(yīng)用于Command對(duì)象的所有Parameter對(duì)象。Recordset對(duì)象具有Fields集合,包含所有定義Recordset對(duì)象列的Field對(duì)象。另外,Connection、Command、Recordset和Field對(duì)象都具有Properties集合。它包含所有屬于各個(gè)包含對(duì)象的Property對(duì)象。ADO對(duì)象擁有可在其上使用的諸如“整型”、“字符型”或“布爾型”這樣的普通數(shù)據(jù)類型來(lái)設(shè)置或檢索值的屬性。然而,有必要將某些屬性看成是數(shù)據(jù)類型“COLLECTIONOBJECT”的返回值。相應(yīng)的,集合對(duì)象具有存儲(chǔ)和檢索適合該集合的其他對(duì)象的方法。例如,可認(rèn)為Recordset對(duì)象具有能夠返回集合對(duì)象的Properties屬性。該集合對(duì)象具有存儲(chǔ)和檢索描述Recordset性質(zhì)的Property對(duì)象的方法。事件“事件”是對(duì)將要發(fā)生或已經(jīng)發(fā)生的某些操作的通知。一般情況下,可用事件高效地編寫包含幾個(gè)異步任務(wù)的應(yīng)用程序。對(duì)象模型無(wú)法顯式體現(xiàn)事件,只能在調(diào)用事件處理程序例程時(shí)表現(xiàn)出來(lái)。在操作開(kāi)始之前調(diào)用的事件處理程序便于對(duì)操作參數(shù)進(jìn)行檢查或修改,然后取消或允許操作完成。操作完成后調(diào)用的事件處理程序在異步操作完成后進(jìn)行通知。多個(gè)操作經(jīng)過(guò)增強(qiáng)可以有選擇地異步執(zhí)行。例如,用于啟動(dòng)異步Recordset.Open操作的應(yīng)用程序?qū)⒃诓僮鹘Y(jié)束時(shí)得到執(zhí)行完成事件的通知。使用對(duì)象的ADO編程模型ADO的目標(biāo)是訪問(wèn)、編輯和更新數(shù)據(jù)源,而編程模型體現(xiàn)了為完成該目標(biāo)所必需的系列動(dòng)作的順序。ADO提供類和對(duì)象以完成以下活動(dòng):連接到數(shù)據(jù)源(Connection),并可選擇開(kāi)始一個(gè)事務(wù)??蛇x擇創(chuàng)建對(duì)象來(lái)表示SQL命令(Command)??蛇x擇在SQL命令中指定列、表和值作為變量參數(shù)(Parameter)。執(zhí)行命令(Command、Connection或Recordset)。如果命令按行返回,則將行存儲(chǔ)在緩存中(Recordset)。可選擇創(chuàng)建緩存視圖,以便能對(duì)數(shù)據(jù)進(jìn)行排序、篩選和定位(Recordset)。通過(guò)添加、刪除或更改行和列編輯數(shù)據(jù)(Recordset)。在適當(dāng)情況下,使用緩存中的更改內(nèi)容來(lái)更新數(shù)據(jù)源(Recordset)。如果使用了事務(wù),則可以接受或拒絕在完成事務(wù)期間所作的更改。結(jié)束事務(wù)(Connection)。ADO對(duì)象模型總結(jié)ADO對(duì)象總結(jié)對(duì)象說(shuō)明Connection啟用數(shù)據(jù)的交換。Command體現(xiàn)SQL語(yǔ)句。Parameter體現(xiàn)SQL語(yǔ)句參數(shù)。Recordset啟用數(shù)據(jù)的定位和操作。Field體現(xiàn)Recordset對(duì)象列。Error體現(xiàn)連接錯(cuò)誤。Property體現(xiàn)ADO對(duì)象特性。ADO集合總結(jié)集合說(shuō)明Errors為響應(yīng)單個(gè)連接錯(cuò)誤而創(chuàng)建的所有Error對(duì)象。Parameters與Command對(duì)象關(guān)聯(lián)的所有Parameter對(duì)象。Fields與Recordset對(duì)象關(guān)聯(lián)的所有Field對(duì)象。Properties與Connection、Command、Recordset或Field對(duì)象關(guān)聯(lián)的所有Property對(duì)象。ADO事件處理程序總結(jié)ConnectionEvents說(shuō)明BeginTransComplete、CommitTransComplete、RollbackTransComplete事務(wù)管理—通知連接中的當(dāng)前事務(wù)已開(kāi)始、提交或回卷。WillConnect、ConnectComplete、Disconnect連接管理—通知當(dāng)前連接將要開(kāi)始、已經(jīng)開(kāi)始或結(jié)束。WillExecute、ExecuteComplete命令執(zhí)行管理—通知連接中的當(dāng)前命令將要開(kāi)始或已經(jīng)結(jié)束。InfoMessage信息—通知獲得與當(dāng)前操作相關(guān)的附加信息。RecordsetEvents說(shuō)明FetchProgress、FetchComplete檢索狀態(tài)—通知數(shù)據(jù)檢索操作的進(jìn)程或檢索操作已經(jīng)完成。WillChangeField、FieldChangeComplete字段更改管理—通知當(dāng)前字段的值將要更改或已經(jīng)更改。WillMove、MoveComplete、EndOfRecordset定位管理—通知在Recordset中當(dāng)前行的位置將要更改、已經(jīng)更改或已到達(dá)Recordset的結(jié)尾。WillChangeRecord、RecordChangeComplete行更改管理—通知有關(guān)Recordset當(dāng)前行中某些內(nèi)容將要更改,或已經(jīng)更改。WillChangeRecordset、RecordsetChangeComplete記錄集更改管理—通知當(dāng)前Recordset中某些內(nèi)容將要更改,或已經(jīng)更改。遠(yuǎn)程數(shù)據(jù)訪問(wèn)的解決方案問(wèn)題ADO可讓應(yīng)用程序直接訪問(wèn)并修改數(shù)據(jù)源(有時(shí)稱為雙層系統(tǒng))。例如,如果要連接到包含所需數(shù)據(jù)的數(shù)據(jù)源,則該連接即是在雙層系統(tǒng)中的直接連接。然而,也需要通過(guò)象MicrosoftInternetInformationServer(IIS)這樣的媒介間接地訪問(wèn)數(shù)據(jù)源。這種方法稱為三層系統(tǒng)。IIS采用客戶端/服務(wù)器系統(tǒng),該系統(tǒng)可幫助本地(或客戶端)的應(yīng)用程序通過(guò)Internet或Intranet高效地調(diào)用遠(yuǎn)程(或服務(wù)器)程序。服務(wù)器程序訪問(wèn)數(shù)據(jù)源,并可有選擇地處理已獲得的數(shù)據(jù)。例如,您的IntranetWeb頁(yè)包含有用Microsoft?VisualBasic?ScriptingEdition(VBScript)編寫的應(yīng)用程序,該程序連接IIS。IIS相應(yīng)地連接實(shí)際數(shù)據(jù)源,檢索數(shù)據(jù),以某種方式處理數(shù)據(jù),然后將已處理的信息返回給應(yīng)用程序。在這個(gè)例子中,應(yīng)用程序從未直接連接數(shù)據(jù)源,該工作由IIS完成。而IIS利用ADO來(lái)訪問(wèn)數(shù)據(jù)。注意

客戶端/服務(wù)器應(yīng)用程序不一定必須基于Internet或Intranet(即基于Web),它可以僅由局域網(wǎng)上的編譯程序組成。但是,典型的范例是基于Web的應(yīng)用程序。因?yàn)橐恍┛梢暬丶T如網(wǎng)格、復(fù)選框或列表可以使用返回信息,所以返回信息必須易于被可視化控件使用。用戶需要的是簡(jiǎn)單有效的應(yīng)用程序編程接口,該程序應(yīng)支持三層系統(tǒng),同時(shí)能夠象在雙層系統(tǒng)上檢索信息一樣容易返回信息?!斑h(yuǎn)程數(shù)據(jù)服務(wù)”(RDS)即是這樣的接口。解決方案RDS定義的編程模型(訪問(wèn)和更新數(shù)據(jù)源必需的系列活動(dòng))通過(guò)如InternetInformationServer這樣的中間媒介來(lái)訪問(wèn)數(shù)據(jù)。編程模型總結(jié)了RDS的全部功能。編程模型通過(guò)對(duì)象模型,即“對(duì)象”集來(lái)表達(dá)并實(shí)現(xiàn)編程模型。對(duì)象擁有能操作數(shù)據(jù)的“方法”,以及能夠表示數(shù)據(jù)屬性或控制某些對(duì)象方法行為的“屬性”。與對(duì)象關(guān)聯(lián)的是“事件”,事件用于通知某些操作已經(jīng)發(fā)生,或?qū)⒁l(fā)生。基本的RDS編程模型RDS為在如下環(huán)境中存在的應(yīng)用程序確定地址:客戶端應(yīng)用程序指定將在服務(wù)器上執(zhí)行的程序,并指定用來(lái)返回相應(yīng)信息的參數(shù)。服務(wù)器上被調(diào)用的程序訪問(wèn)指定的數(shù)據(jù)源,檢索信息,對(duì)數(shù)據(jù)進(jìn)行相應(yīng)處理,然后將結(jié)果信息按易于使用的格式返回給客戶端應(yīng)用程序。RDS為您提供了執(zhí)行以下系列操作的方式:指定在服務(wù)器上被調(diào)用的程序,并得到從客戶端引用該程序的途徑。(該引用有時(shí)稱為“代理”,它代表遠(yuǎn)程服務(wù)器程序??蛻舳藨?yīng)用程序象調(diào)用本地程序一樣“調(diào)用”代理,但實(shí)際上調(diào)用的是遠(yuǎn)程服務(wù)器程序。)調(diào)用服務(wù)器程序。將參數(shù)傳送到標(biāo)識(shí)數(shù)據(jù)源及所要發(fā)布命令的服務(wù)器程序。(服務(wù)器程序?qū)嶋H上使用ADO訪問(wèn)數(shù)據(jù)源。ADO與所給參數(shù)中的一個(gè)建立連接,然后發(fā)布在其他參數(shù)中指定的命令)。服務(wù)器程序從數(shù)據(jù)源獲得了Recordset對(duì)象??梢赃x擇在服務(wù)器上處理Recordset對(duì)象。服務(wù)器程序?qū)⒆罱K的Recordset對(duì)象返回客戶端應(yīng)用程序。在客戶端,Recordset對(duì)象被轉(zhuǎn)換成為便于可視化控件使用的格式。任何對(duì)Recordset對(duì)象所作的修改都將返回給服務(wù)器程序,服務(wù)器程序用這些修改來(lái)更新數(shù)據(jù)源。該編程模型包含了某些便利功能。如果不需要復(fù)雜的服務(wù)器程序訪問(wèn)數(shù)據(jù)源,并提供所需的連接和命令參數(shù),RDS將自動(dòng)使用簡(jiǎn)單的默認(rèn)服務(wù)器程序來(lái)檢索指定數(shù)據(jù)。如果仍需要進(jìn)行復(fù)雜處理,可指定自定義的服務(wù)器程序。例如,由于自定義服務(wù)器程序有足夠的ADO處置能力,所以能連接幾個(gè)不同的數(shù)據(jù)源,并把這些數(shù)據(jù)以某種復(fù)雜的方式結(jié)合起來(lái),然后將簡(jiǎn)化的、經(jīng)過(guò)處理的結(jié)果返回給客戶端應(yīng)用程序。最后,如果在這兩者之間還需要?jiǎng)e的方式,ADO支持自定義默認(rèn)服務(wù)器程序的行為。RDS編程模型詳細(xì)資料下列元素是RDS編程模型中的關(guān)鍵部分:RDS.DataSpaceRDSServer.DataFactoryRDS.DataControl事件RDS.DataSpace客戶端應(yīng)用程序必需指定服務(wù)器和要調(diào)用的服務(wù)器程序。相應(yīng)的,應(yīng)用程序接收對(duì)服務(wù)器程序的引用,并且將此引用當(dāng)作實(shí)際的服務(wù)器程序。RDS對(duì)象模型通過(guò)RDS.DataSpace對(duì)象來(lái)體現(xiàn)該功能。使用程序標(biāo)識(shí)符(即ProgID)來(lái)指定服務(wù)器程序。服務(wù)器使用ProgID和服務(wù)器計(jì)算機(jī)的注冊(cè)表來(lái)定位需初始化的程序的信息。根據(jù)服務(wù)器程序是在由Internet或Intranet連接的遠(yuǎn)程服務(wù)器上,還是在連接局域網(wǎng)的服務(wù)器上,或者根本不在服務(wù)器而在本地動(dòng)態(tài)連接庫(kù)(DLL)上,RDS可在內(nèi)部進(jìn)行劃分。該劃分決定在客戶與服務(wù)器之間交換數(shù)據(jù)的方式,并對(duì)于返回給客戶端應(yīng)用程序的“引用”類型中有著實(shí)際的區(qū)別。然而,從用戶的角度來(lái)看,該劃分沒(méi)有特殊的意義。所有這些只是令您接收到可用的程序引用。RDSServer.DataFactoryRDS提供的默認(rèn)服務(wù)器程序可對(duì)數(shù)據(jù)源執(zhí)行SQL查詢并返回Recordset對(duì)象,或獲得Recordset對(duì)象并更新數(shù)據(jù)源。RDS對(duì)象模型用RDSServer.DataFactory對(duì)象來(lái)體現(xiàn)該功能。此外,該對(duì)象具有創(chuàng)建空的Recordset對(duì)象的方法,可用編程的方式對(duì)該空Recordset進(jìn)行填寫。它還有另一種方法可將Recordset轉(zhuǎn)換為文本串來(lái)建立Web頁(yè)。使用ADO,可以利用DataFactory處理程序和包含連接、命令和安全參數(shù)的自定義文件覆蓋一些標(biāo)準(zhǔn)連接和RDSServer.DataFactory的命令行為。服務(wù)器程序有時(shí)可稱作“業(yè)務(wù)對(duì)象”。您可以編寫自己的自定義業(yè)務(wù)對(duì)象,它可以執(zhí)行復(fù)雜數(shù)據(jù)訪問(wèn),有效性檢查等。甚至在編寫自己的自定義業(yè)務(wù)對(duì)象時(shí),可創(chuàng)建RDSServer.DataFactory對(duì)象的實(shí)例并且使用它的一些方法完成自己的任務(wù)。RDS.DataControlRDS提供了可將RDS.DataSpace和RDSServer.DataFactory的功能結(jié)合在一起的方法。RDS也能讓可視化控件容易地使用查詢數(shù)據(jù)源所返回的Recordset對(duì)象。大多數(shù)情況下,RDS總是盡可能多的自動(dòng)訪問(wèn)服務(wù)器上的信息,并且將信息顯示在可視化控件中。RDS對(duì)象模型用RDS.DataControl對(duì)象來(lái)體現(xiàn)該功能。RDS.DataControl有兩個(gè)方面。一個(gè)方面與數(shù)據(jù)源有關(guān)。如果設(shè)置RDS.DataControl的命令和連接屬性,它將會(huì)自動(dòng)使用RDS.DataSpace創(chuàng)建對(duì)默認(rèn)RDSServer.DataFactory對(duì)象的引用。然后RDSServer.DataFactory將使用連接屬性的值連接到數(shù)據(jù)源,并使用命令屬性的值從數(shù)據(jù)源獲得Recordset,最后將Recordset對(duì)象返回到RDS.DataControl。第二個(gè)方面涉及在可視化控件中顯示被返回的Recordset信息??梢允箍梢暱丶cRDS.DataControl相關(guān)聯(lián)(在稱為綁定的過(guò)程中),并訪問(wèn)關(guān)聯(lián)的Recordset對(duì)象中的信息,查詢結(jié)果顯示在InternetExplorer的Web頁(yè)上。每個(gè)RDS.DataControl對(duì)象將一個(gè)表示單個(gè)查詢結(jié)果的Recordset對(duì)象綁定到一個(gè)或多個(gè)可視控件(例如文本框、組合框和網(wǎng)格控件等)上。在每頁(yè)上可以有多個(gè)RDS.DataControl對(duì)象。每個(gè)RDS.DataControl對(duì)象都可連接不同的數(shù)據(jù)源,并且包含各自的查詢結(jié)果。RDS.DataControl對(duì)象也有其自己的方法用于定位、排序和篩選相關(guān)聯(lián)的Recordset對(duì)象的行。這些方法雖然相似,但與ADORecordset對(duì)象所用的方法不同。事件RDS支持兩個(gè)獨(dú)立于ADO事件模型的自身事件。無(wú)論RDS.DataControlReadyState屬性何時(shí)更改均調(diào)用onReadyStateChange事件,以此對(duì)異步操作的完成、結(jié)束或出現(xiàn)錯(cuò)誤等發(fā)出通知。無(wú)論何時(shí)發(fā)生錯(cuò)誤,即使發(fā)生在異步操作執(zhí)行的過(guò)程中,均調(diào)用onError事件。注意

MicrosoftInternetExplorer環(huán)境提供給RDS兩個(gè)附加事件:onDataSetChanged(Recordset在起作用但還在檢索行)和onDataSetComplete(Recordset已結(jié)束檢索行)。使用對(duì)象的RDS編程模型RDS的目的是通過(guò)InternetInformationServer這樣的媒介來(lái)訪問(wèn)和更新數(shù)據(jù)源。編程模型則指定為完成這個(gè)目的所必需的活動(dòng)序列。對(duì)象模型指定其方法和屬性影響編程模型的對(duì)象。RDS提供執(zhí)行以下動(dòng)作序列的途徑:指定在服務(wù)器上被調(diào)用的程序,并獲得通過(guò)客戶端調(diào)用該程序的方式(代理)。(RDS.DataSpace)調(diào)用服務(wù)器程序。將參數(shù)傳遞給標(biāo)識(shí)數(shù)據(jù)源及所要發(fā)布的命令的服務(wù)器程序。(代理或RDS.DataControl)服務(wù)器程序從數(shù)據(jù)源獲得Recordset對(duì)象(一般通過(guò)使用ADO)??蛇x擇在服務(wù)器上處理Recordset對(duì)象。(RDSServer.DataFactory)服務(wù)器程序?qū)⒆罱K的Recordset對(duì)象返回客戶端應(yīng)用程序。(代理)在客戶端,Recordset對(duì)象被轉(zhuǎn)換成可視控件能方便使用的格式。(可視控件和RDS.DataControl)對(duì)Recordset對(duì)象所作的更改被返回服務(wù)器并用于更新數(shù)據(jù)源。(RDS.DataControl或RDSServer.DataFactory)RDS對(duì)象模型總結(jié)對(duì)象說(shuō)明RDS.DataSpace該對(duì)象只包含獲得服務(wù)器代理的方法。代理可以是默認(rèn)或自定義的服務(wù)器程序(業(yè)務(wù)對(duì)象)。在Internet、Intranet、局域網(wǎng)或本地動(dòng)態(tài)連接庫(kù)上均可調(diào)用服務(wù)器程序。RDSServer.DataFactory該對(duì)象表示默認(rèn)的服務(wù)器程序。它執(zhí)行默認(rèn)的RDS數(shù)據(jù)檢索和更新行為。RDS.DataControl該對(duì)象可自動(dòng)調(diào)用RDS.DataSpace和RDSServer.DataFactory對(duì)象。使用該對(duì)象調(diào)用默認(rèn)的RDS數(shù)據(jù)檢索或更新行為。該對(duì)象也為可視控件提供訪問(wèn)被返回的Recordset對(duì)象的途徑。ADO特性創(chuàng)建Recordset的捷徑ADO提供便捷方法創(chuàng)建Recordset:將新的Field對(duì)象添加到Recordset的Field集合。隨后,可以打開(kāi)Recordset并插入來(lái)自任意源(不必是數(shù)據(jù)庫(kù))的數(shù)據(jù)。還可以通過(guò)程序產(chǎn)生數(shù)據(jù)。新Recordset可以使用對(duì)任意Recordset均為可用的所有數(shù)據(jù)操作方法。使用Recordset將信息提供給可視控件,甚至更新實(shí)際數(shù)據(jù)源。Recordset持久性使用記錄集持久性,可以將Recordset數(shù)據(jù)和元數(shù)據(jù)保存為文件。隨后,使用持久文件來(lái)重新建立Recordset對(duì)象。持久文件可以保存在本地驅(qū)動(dòng)器、網(wǎng)絡(luò)服務(wù)器上或者作為URL保存在Web站點(diǎn)上。另外,GetString方法將Recordset對(duì)象轉(zhuǎn)換成表單,在表單中列和行使用指定的字符分界。詳細(xì)資料MicrosoftOLEDBPersistenceProvider支持使用Recordset對(duì)象Save方法將Recordset對(duì)象保存在文件中。隨后,使用Recordset對(duì)象的Open、或Connection對(duì)象的Execute方法可恢復(fù)持久文件。Recordset對(duì)象被轉(zhuǎn)換為能被保存在文件中的表單。Recordset對(duì)象可以按所擁有的高級(jí)數(shù)據(jù)圖表(ADTG)格式保存,或者按打開(kāi)的可擴(kuò)展標(biāo)記語(yǔ)言(XML)格式保存。掛起更改保存在持久文件中。因此,可以發(fā)布查詢返回Recordset對(duì)象、編輯記錄集、保存該記錄集和掛起變化、以后恢復(fù)該記錄集、然后使用保存的掛起變化更新數(shù)據(jù)源。用法保存記錄集:DimrsasNewADODB.Recordsetrs.Save"c:\yourFile.adtg",adPersistADTG使用Recordset.Open打開(kāi)持久文件:dimrsasNewADODB.Recordsetrs.Open"c:\yourFile.adtg","Provider=MSPersist",,,adCmdFile可選地,如果Recordset沒(méi)有活動(dòng)的連接,則都可以接受所有的默認(rèn)值和簡(jiǎn)單的代碼:dimrsasNewADODB.Recordsetrs.Open"c:\yourFile.adtg"使用Connection.Execute打開(kāi)持久文件:dimconnasNewADODB.ConnectiondimrsasNewADODB.Recordsetconn.Open"Provider=MSPersist"setrs=conn.execute("c:\yourFile.adtg")使用RDS.DataControl打開(kāi)持久文件:在這種情況下,沒(méi)有設(shè)置Server屬性。DimdcasNewRDS.DataControldc.Connection="Provider=MSPersist"dc.SQL="c:\yourFile.adtg"dc.Refresh索引支持和查找、排序以及過(guò)濾對(duì)字段進(jìn)行索引可以極大增強(qiáng)Recordset對(duì)象的Find方法、以及Sort和Filter屬性的性能。通過(guò)設(shè)置Field對(duì)象的動(dòng)態(tài)Optimize屬性,可以創(chuàng)建該對(duì)象的內(nèi)部索引。當(dāng)將CursorLocation屬性設(shè)置為adUseClient時(shí),該動(dòng)態(tài)屬性被添加給Field對(duì)象的Properties集合。請(qǐng)記住該索引對(duì)于ADO是內(nèi)部的,即無(wú)法訪問(wèn)該索引或者將該索引用于其他的目的。Sort屬性決定穿越Recordset行的順序,F(xiàn)ilter屬性決定當(dāng)穿越行時(shí)哪些行是可訪問(wèn)的,F(xiàn)ind方法在Recordset的索引列(字段)中快速定位值。ADOforWindowsFoundationClasses通過(guò)Microsoft?VisualJ++?(Java編程語(yǔ)言),可使用ADO應(yīng)用程序編程接口訪問(wèn)數(shù)據(jù)。ADOforWindowsFoundationClasses(ADO/WFC)支持所有標(biāo)準(zhǔn)ADO方法、屬性、對(duì)象和事件。但是,需要VARIANT作為參數(shù)并使用類似Microsoft?VisualBasic?的語(yǔ)言可顯示優(yōu)良性能的操作,在如VisualJ++的語(yǔ)言中卻僅顯示較低的性能。因?yàn)樵撛?,ADO/WFC同時(shí)提供了Field對(duì)象的訪問(wèn)者函數(shù),用本身Java數(shù)據(jù)類型代替了VARIANT數(shù)據(jù)類型。ADO事件模型和異步操作ADO事件模型支持某些同步和異步的ADO操作,在這些操作開(kāi)始之前或完成之后會(huì)產(chǎn)生“事件”(即通知)。事件實(shí)際上是對(duì)在應(yīng)用程序中定義的事件處理程序例程的調(diào)用。在操作開(kāi)始之前被調(diào)用的事件處理程序允許您檢查或修改操作參數(shù),然后取消操作或讓它完成。由于ADO支持異步操作,在操作完成之后被調(diào)用的事件處理程序尤其重要。例如,啟動(dòng)異步Recordset.Open操作的應(yīng)用程序在操作結(jié)束時(shí)會(huì)接收到執(zhí)行完成事件的通知。ADO事件處理程序總結(jié)事件分成兩類。ConnectionEvent類從屬于Connection對(duì)象的操作,而RecordsetEvent類則從屬于Recordset對(duì)象的操作。ConnectionEvents—在連接的事務(wù)開(kāi)始、提交或回卷時(shí),或在Command被執(zhí)行、連接開(kāi)始或結(jié)束時(shí),將引發(fā)該類事件。RecordsetEvents—在Recordset對(duì)象行中定位、更改Recordset行中的字段、更改Recordset的行、或是在Recordset作任何修改時(shí),將引發(fā)該類事件。ADO事件處理程序概述ConnectionEvent說(shuō)明BeginTransComplete、CommitTransComplete、RollbackTransComplete事務(wù)管理—關(guān)于連接上的當(dāng)前事務(wù)已經(jīng)開(kāi)始、已經(jīng)提交、或者已經(jīng)回卷的通知。WillConnect、ConnectComplete,Disconnect連接管理—關(guān)于當(dāng)前連接即將開(kāi)始、已經(jīng)開(kāi)始、或者已經(jīng)結(jié)束的通知。WillExecute、ExecuteComplete命令執(zhí)行管理—關(guān)于連接的當(dāng)前命令的執(zhí)行即將開(kāi)始、或者已經(jīng)結(jié)束的通知。InfoMessage信息管理—關(guān)于當(dāng)前操作有附加信息的通知。RecordsetEvent說(shuō)明FetchProgress,FetchComplete檢索狀態(tài)—關(guān)于數(shù)據(jù)檢索操作進(jìn)度、或者檢索操作已經(jīng)結(jié)束的通知。WillChangeField,FieldChangeComplete字段更改管理—關(guān)于當(dāng)前字段值即將更改、或者已經(jīng)更改的通知。WillMove,MoveComplete,EndOfRecordset定位管理—關(guān)于當(dāng)前行在Recordset中的位置即將更改、已經(jīng)更改、或者已經(jīng)到達(dá)Recordset結(jié)尾的通知。WillChangeRecord,RecordChangeComplete行更改管理—關(guān)于Recordset當(dāng)前行的某些地方即將更改、或者已經(jīng)更改的通知。WillChangeRecordset,RecordsetChangeCompleteRecordset更改管理—關(guān)于當(dāng)前Recordset的某些地方即將更改、或者已經(jīng)更改的通知。事件類型Will事件操作開(kāi)始之前調(diào)用的事件處理程序使您有機(jī)會(huì)檢查或修改操作參數(shù),然后取消操作或允許完成該操作。這些事件處理程序例程通常具有形如WillEvent(Will事件)的名稱。Complete事件操作完成之后調(diào)用的事件處理程序?qū)⑾驊?yīng)用程序發(fā)出操作已經(jīng)結(jié)束的通知。當(dāng)掛起的操作被Will事件處理程序取消時(shí),該事件處理程序也會(huì)收到通知。這些事件處理程序例程通常具有如象EventComplete(Complete事件)的名稱。Will和Complete事件一般成對(duì)使用。其他事件其他事件處理程序(事件名不使用WillEvent或EventComplete格式)僅在操作完成后被調(diào)用。事件參數(shù)每個(gè)事件處理程序都有一個(gè)控制它的狀態(tài)參數(shù)。大部分Complete事件都有錯(cuò)誤參數(shù)用于報(bào)告引起事件發(fā)生的操作是否成功。另外還有一個(gè)對(duì)象參數(shù),用于標(biāo)識(shí)操作所針對(duì)的ADO對(duì)象。參數(shù)同時(shí)被傳遞到Will事件以便用于掛起操作。這樣您就有機(jī)會(huì)檢查參數(shù)并確定操作是否應(yīng)該完成。某些事件處理程序有原因參數(shù),該參數(shù)可以提供有關(guān)事件發(fā)生原因的詳細(xì)信息。狀態(tài)參數(shù)當(dāng)事件處理程序例程被調(diào)用時(shí),狀態(tài)參數(shù)將被設(shè)置為下列信息值之一。值說(shuō)明adStatusOK引發(fā)事件的操作已成功發(fā)生。adStatusErrorsOccurred引發(fā)事件的操作未成功發(fā)生,或Will事件取消了操作。有關(guān)細(xì)節(jié),請(qǐng)單擊錯(cuò)誤參數(shù)。adStatusCantDenyWill事件無(wú)法請(qǐng)求取消即將開(kāi)始的操作。在事件處理程序例程返回之前,應(yīng)當(dāng)保持狀態(tài)參數(shù)不變,或?qū)⑵湓O(shè)置為下列請(qǐng)求值之一。值說(shuō)明adStatusUnwantedEvent請(qǐng)求該事件處理程序不接收以后的通知。adStatusCancel請(qǐng)求取消即將開(kāi)始的操作。由事件類型所決定,當(dāng)事件處理程序被調(diào)用時(shí),狀態(tài)參數(shù)可以取下列值之一。事件類型值WilladStatusOK,adStatusCantDenyCompleteadStatusOK,adStatusErrorsOccurred取決于事件類型,在事件處理程序返回時(shí),狀態(tài)參數(shù)可以取下列值之一。事件類型值WilladStatusOK,adStatusCancel,adStatusUnwantedEventCompleteadStatusOK,adStatusUnwantedEvent錯(cuò)誤參數(shù)錯(cuò)誤參數(shù)是對(duì)ADOError對(duì)象的引用。狀態(tài)參數(shù)為adStatusErrorsOccurred時(shí),該對(duì)象包含操作失敗的詳細(xì)信息。對(duì)象參數(shù)對(duì)象參數(shù)是對(duì)所操作的ADO對(duì)象的引用。例如,可以同時(shí)打開(kāi)幾個(gè)Connection對(duì)象,但一次只能打開(kāi)一個(gè)Disconnect事件處理程序。如果所有連接關(guān)閉,將對(duì)象參數(shù)設(shè)置為關(guān)閉的Connection對(duì)象,即可調(diào)用Disconnect事件處理程序。原因參數(shù)原因參數(shù)(adReason)提供有關(guān)事件發(fā)生原因的附加信息。帶有adReason參數(shù)的方法可以被多次調(diào)用—甚至被相同的操作調(diào)用,但每次調(diào)用都有不同原因。例如,WillChangeRecord事件處理程序被某些操作調(diào)用,這些操作將進(jìn)行或撤消記錄的插入、刪除或修改。adReason參數(shù)被作為只處理特殊事件的篩選器來(lái)使用。必須在adStatus參數(shù)中返回adStatusUnwantedEvent,要求不帶adReason參數(shù)的事件處理程序停止接收事件通知。但是,帶有adReason參數(shù)的事件處理程序可能會(huì)接收幾個(gè)通知,每個(gè)通知有不同原因。所以,對(duì)每個(gè)不同原因產(chǎn)生的通知,必須返回adStatusUnwantedEvent。例如,假設(shè)WillChangeRecord事件處理程序是用Microsoft?VisualBasic?編寫的。如果您以后不想接收任何進(jìn)一步的通知,只需編寫如下代碼:SetadStatus=adStatusUnwantedEvent但是,如果要處理其行將被刪除的事件,但取消所有其他原因所帶來(lái)的通知時(shí),請(qǐng)編寫如下程序:if(adReason=adRsnDelete)'處理此原因引起的事件。...else'停止接收任何其他原因引起的事件。SetadStatus=adStatusUnwantedEvent...事件處理程序如何共同工作無(wú)論是否實(shí)際使用事件,都必須執(zhí)行ConnectionEvent和RecordsetEvent類中的所有事件處理程序。必須執(zhí)行的工作量取決于所用的編程語(yǔ)言。某些語(yǔ)言,如MicrosoftVisualBasic可以為您完成所有工作。其他語(yǔ)言如Microsoft?VisualC++?則需要您做所有工作。而Microsoft?VisualJ++?withADO/WFC則介于兩者之間,該語(yǔ)言為您處理大部分工作。雖然由您自己實(shí)現(xiàn)事件處理程序的工作量較大,但可以完成用VisualBasic這類語(yǔ)言無(wú)法進(jìn)行的工作。例如,在MicrosoftVisualC++中,一個(gè)RecordsetEvent處理程序可以處理在操作多個(gè)Recordset對(duì)象時(shí)所產(chǎn)生的通知。Will和Complete事件處理程序可以成對(duì)或分開(kāi)使用。成對(duì)的事件處理程序如下設(shè)定說(shuō)明Will事件成功時(shí)會(huì)出現(xiàn)什么情況。Recordset對(duì)象擁有成對(duì)事件WillChangeField和FieldChangeComplete。在應(yīng)用程序中開(kāi)始更改字段值時(shí),將調(diào)用WillChangeField事件處理程序;可以返回一個(gè)用于更改字段的標(biāo)志。操作完成時(shí),F(xiàn)ieldChangeComplete事件將通知應(yīng)用程序操作已經(jīng)結(jié)束,而事件處理程序狀態(tài)參數(shù)則報(bào)告操作成功。如下設(shè)定說(shuō)明Will事件將操作取消時(shí)會(huì)出現(xiàn)什么情況。在同一應(yīng)用程序中,更改另一個(gè)字段。將調(diào)用WillChangeField事件處理程序??赡芤?yàn)槟撤N原因您決定不接受更改字段,所以您在狀態(tài)參數(shù)中返回adStatusCancel。結(jié)果,操作未能完成。FieldChangeComplete事件通知您操作已經(jīng)結(jié)束。事件處理程序狀態(tài)參數(shù)被設(shè)為adStatusErrorsOccurred;錯(cuò)誤參數(shù)引用Error對(duì)象,而Error對(duì)象的Number屬性被設(shè)為ADO值或提供者,從而指示操作已被取消。多個(gè)Will和Complete事件處理程序可被同一操作調(diào)用。如下設(shè)定說(shuō)明當(dāng)多個(gè)will事件成功時(shí)會(huì)出現(xiàn)了什么情況。Recordset對(duì)象擁有成對(duì)事件WillChangeField、FieldChangeComplete、WillChangeRecord和RecordChangeComplete。開(kāi)始更改字段值時(shí)將調(diào)用WillChangeField事件處理程序;可以返回一個(gè)用于更改字段的標(biāo)志。下一步,調(diào)用WillChangeRecord事件處理程序,再次指示操作應(yīng)該結(jié)束。注意

所有從屬于ADO對(duì)象的特定實(shí)例的will事件處理程序通常都將被調(diào)用。但是,調(diào)用過(guò)程沒(méi)有特定次序。操作結(jié)束時(shí),將調(diào)用FieldChangeComplete和RecordChangeComplete事件處理程序。多個(gè)Will和Complete事件處理程序可被同一操作調(diào)用,但是可以取消掛起的操作。如下設(shè)定說(shuō)明在多個(gè)will事件的最后一個(gè)取消操作時(shí),將出現(xiàn)什么情況。再一次,Recordset擁有成對(duì)的WillChangeField、FieldChangeComplete、WillChangeRecord和RecordChangeComplete事件。開(kāi)始更改字段值時(shí)將調(diào)用WillChangeField事件處理程序;可以返回一個(gè)用于更改字段的標(biāo)志。下一步,將調(diào)用WillChangeRecord事件處理程序。也許您認(rèn)為字段更改本身沒(méi)有問(wèn)題,但是它將在記錄中創(chuàng)建一個(gè)整體錯(cuò)誤。您返回adStatusCancel,指示不接受更改字段。WillChangeField事件處理程序已經(jīng)允許進(jìn)行操作。操作被WillChangeRecord事件處理程序取消,因此未能完成。調(diào)用FieldChangeComplete事件處理程序,將狀態(tài)參數(shù)設(shè)置為adStatusErrorsOccurred;并對(duì)錯(cuò)誤參數(shù)進(jìn)行適當(dāng)?shù)脑O(shè)置。下一步,RecordChangeComplete事件處理程序被設(shè)置為adStatusErrorsOccurred的狀態(tài)參數(shù)調(diào)用。匹配的Complete事件被will事件調(diào)用。多個(gè)Will和Complete事件處理程序可被同一個(gè)操作調(diào)用,但是可以取消掛起操作。如下設(shè)定說(shuō)明當(dāng)操作被事件處理程序、而不是多個(gè)will事件的最后一個(gè)事件取消時(shí),會(huì)出現(xiàn)什么情況。再一次,Recordset擁有成對(duì)的WillChangeField、FieldChangeComplete、WillChangeRecord和RecordChangeComplete事件。在開(kāi)始更改字段值時(shí)將調(diào)用WillChangeField事件處理程序,返回adStatusCancel,從而指示更改字段是不可接受的。操作沒(méi)有完成;FieldChangeComplete事件處理程序通知您操作已經(jīng)結(jié)束,狀態(tài)和錯(cuò)誤參數(shù)設(shè)置正確。然而,由于第一個(gè)will事件取消操作,WillChangeRecord(還有RecordChangeComplete)事件處理程序未被調(diào)用。通常,如果will事件取消操作,其他will事件處理程序?qū)⒉粫?huì)被調(diào)用。不成對(duì)的事件處理程序通過(guò)返回status參數(shù)的adStatusUnwantedEvent可以關(guān)閉任何事件的事件通知。例如,第一個(gè)Complete事件處理程序被調(diào)用時(shí),將返回adStatusUnwantedEvent,并且您隨后只收到will事件。檢查操作中將要使用的參數(shù)時(shí),單個(gè)will事件處理程序會(huì)很有幫助。您可以修改這些操作參數(shù)或者取消操作。另外一種情況是,打開(kāi)Complete事件通知,當(dāng)?shù)谝粋€(gè)will事件處理程序被調(diào)用時(shí),返回adStatusUnwantedEvent。您隨后將只收到Complete事件。單個(gè)Complete事件處理程序是管理異步操作的有效工具。每個(gè)異步操作都具有相應(yīng)的Complete事件。例如,充填很大的Recordset對(duì)象要花很長(zhǎng)時(shí)間。如果應(yīng)用程序編寫恰當(dāng),則可以啟動(dòng)Recordset.Open(...,adAsyncExecute)操作并繼續(xù)其他處理程序。最終您一定會(huì)在ExecuteComplete事件充填Recordset時(shí)收到通知。單個(gè)事件處理程序和多個(gè)對(duì)象MicrosoftVisualC++這類程序語(yǔ)言的靈活性使得一個(gè)事件處理程序可以處理多個(gè)對(duì)象的事件。例如,應(yīng)用一個(gè)Disconnect事件處理程序可以處理多個(gè)Connection對(duì)象的事件。如果一個(gè)連接結(jié)束,Disconnect事件處理程序即會(huì)被調(diào)用。因?yàn)槭录幚沓绦騾?shù)object被設(shè)置到相應(yīng)的Connection對(duì)象,您可以判斷出引起事件的連接。注意

因?yàn)閂isualBasic只能使一個(gè)對(duì)象與一個(gè)事件相關(guān)聯(lián),此技術(shù)不能應(yīng)用于該語(yǔ)言。多個(gè)事件處理程序和單個(gè)操作要讓一個(gè)ADO對(duì)象及其操作與多組事件相關(guān)聯(lián)是可能的,但是不太有用。例如,每次執(zhí)行專門的字段有效性編輯時(shí),可以創(chuàng)建多個(gè)WillChangeField事件。如果字段將要更改,某個(gè)will事件可能會(huì)使字段值的某個(gè)部分有效,而另一個(gè)will事件則會(huì)使另一部分有效。此技術(shù)之所以不太有用,是因?yàn)橥ㄟ^(guò)單個(gè)事件處理程序易于執(zhí)行或調(diào)用所有的編輯程序。但為了完整起見(jiàn),才在此提到它。ADO/WFC中的ADO事件ADOforWindowsFoundationClasses(ADO/WFC)建立在ADO事件模型之上,提供簡(jiǎn)化的應(yīng)用程序接口。通常,ADO/WFC截取ADO事件,將事件參數(shù)合并到單個(gè)事件類之中,然后調(diào)用事件處理程序。使用ADO/WFC中的ADO事件定義自己的事件處理程序方法以處理事件。例如,當(dāng)您要處理ConnectionEvent類中的ConnectComplete事件時(shí),可使用下列程序:publicvoidonConnectComplete(Objectsender,ConnectionEvente){System.out.println("onConnectComplete:"+e);}定義對(duì)象處理程序以表示您的事件處理程序方法。對(duì)ConnectionEvent類型的事件,處理程序?qū)ο髷?shù)據(jù)類型應(yīng)該是ConnectEventHandler,而對(duì)RecordsetEvent類型事件則應(yīng)為RecordsetEventHandler數(shù)據(jù)類型。例如,請(qǐng)為ConnectComplete事件處理程序編寫如下程序:ConnectionEventHandlerhandler=newConnectionEventHandler(this,"onConnectComplete");ConnectionEventHandler構(gòu)造函數(shù)的第一個(gè)參數(shù)是對(duì)某個(gè)類的引用,該類含有第二個(gè)參數(shù)命名的方法。MicrosoftVisualJ++編譯器也支持相同的語(yǔ)法:ConnectionEventHandlerhandler=newConnectionEventHandler(this.onConnectComplete);單個(gè)參數(shù)是對(duì)所需類(即this)及其方法的引用(即onConnectComplete)。在指定用來(lái)處理特殊類型事件的處理程序列表中添加事件處理程序。使用帶有addOnEventName(handler)這類名稱的方法。ADO/WFC在內(nèi)部執(zhí)行所有的ADO事件處理程序。所以,Connection或Recordset操作引起的事件都由ADO/WFC事件處理程序截取。ADO/WFC事件處理程序傳送ADO/WFCConnectionEvent類實(shí)例的ADOConnectionEvent參數(shù),或ADO/WFCRecordsetEvent類實(shí)例的ADORecordsetEvent參數(shù)。這些ADO/WFC類將合并ADO事件參數(shù);也就是說(shuō),對(duì)所有ADOConnectionEvent或RecordsetEvent方法的每個(gè)特有的參數(shù),每個(gè)ADO/WFC都含有一個(gè)相應(yīng)的數(shù)據(jù)成員。然后ADO/WFC通過(guò)ADO/WFC的事件對(duì)象調(diào)用事件處理程序。例如,onConnectComplete事件處理程序有下列簽名:publicvoidonConnectComplete(Objectsender,ConnectionEvente)第一個(gè)參數(shù)是傳送事件(Connection或Recordset)的對(duì)象類型,而第二個(gè)參數(shù)則是ADO/WFC事件對(duì)象(ConnectionEvent或RecordsetEvent)。事件處理程序的簽名比ADO事件簡(jiǎn)單。但是,您還必須要了解ADO事件模型才能知道適用于事件的參數(shù)以及響應(yīng)的方法。從事件處理程序返回到ADO事件的ADO/WFC處理程序。ADO/WFC將復(fù)制相關(guān)的ADO/WFC事件數(shù)據(jù)成員到ADO事件參數(shù),然后返回ADO事件處理程序。結(jié)束處理的時(shí)候,從ADO/WFC事件處理程序列表上刪除處理程序。使用帶有removeOnEventName(handler)這類名稱的方法。不同語(yǔ)言的ADO事件實(shí)例不同的編程語(yǔ)言以不同的方式創(chuàng)建ADO事件實(shí)例。如下所有范例均創(chuàng)建ConnectComplete事件處理程序。VisualBasicDimWithEventconnEventasConnectionDimconnasNewConnectionsetconnEvent=conn'打開(kāi)事件支持。conn.Open(...)...setconnEvent=Nothing'關(guān)閉事件支持。...PrivateSubconnEvent_ConnectComplete(ByValerrasADODB.Error,&_adStatusasADODB.EventStatus,ByValpConnectionasADODB.Connection)'僅當(dāng)adStatus等于adStatusErrorsOccurred時(shí)檢查錯(cuò)誤對(duì)象。...EndSubVisualC++這是關(guān)于在VC++中如何實(shí)例化事件的示意性說(shuō)明。創(chuàng)建在adoint.h文件中由ConnectionEventsVt和RecordsetEventsVt接口所派生的類。classCConnEvent:publicConnectionEventsVt{public:STDMETHODIMPInfoMessage(ADOError*pError,EventStatusEnum*adStatus,_ADOConnection*pConnection);...}classCRstEvent:publicRecordsetEventsVt{public:STDMETHODIMPWillChangeField(LONGcFields,VARIANTFields,EventStatusEnum*adStatus,_ADORecordset*pRecordset);...}在兩個(gè)類中執(zhí)行每個(gè)事件處理程序方法。每個(gè)方法只返回一個(gè)HRESULTofS_OK就夠了。但是,一旦事件處理程序有效,這些事件處理程序就會(huì)在默認(rèn)狀態(tài)下被連續(xù)調(diào)用。為改變這種情況,您可通過(guò)將adStatus設(shè)置為adStatusUnwantedEvent,以便在第一次調(diào)用之后不再請(qǐng)求其他通知。STDMETHODIMPCConnEvent::ConnectComplete(ADOError*pError,EventStatusEnum*adStatus,_ADOConnection*pConnection){*adStatus=adStatusUnwantedEvent;returnS_OK;}事件類繼承了Iunknown,所以也必須執(zhí)行QueryInterface、AddRef和Release方法。如要執(zhí)行類構(gòu)造函數(shù)和析構(gòu)函數(shù),請(qǐng)選擇最易于使用并能簡(jiǎn)化這部分任務(wù)的VC++工具。通過(guò)在Recordset和Connection對(duì)象上向IConnectionPointContainer和IConnectionPoint接口發(fā)出QueryInterface,通知事件處理程序現(xiàn)在已可以使用,然后向各類發(fā)出IConnectionPoint::Advise。例如,假設(shè)您正在使用布爾型函數(shù),該函數(shù)在成功地向Recordset對(duì)象發(fā)出可以使用事件處理程序的通知時(shí)返回“真”值。HRESULThr;DWORDdwEvtClass;IConnectionPointContainer*pCPC=NULL;IConnectionPoint*pCP=NULL;CRstEvent*pRStEvent=NULL;..._RecordsetPtrpRs();pRs.CreateInstance(__uuidof(Recordset));pRStEvent=NewCRstEvent();if(pRStEvent==NULL)returnFALSE;...hr=pRs->QueryInterface(IID_IConnectionPointContainer,&pCPC);if(FAILED(hr))returnFALSE;hr=pCPC->FindConnectionPoint(IID_ADORecordsetEvents,&pCP);pCPC->Release();//AlwaysReleasenow,evenbeforechecking.if(FAILED(hr))returnFALSE;hr=pCP->Advise(pRstEvent,&dwEvtClass);//Turnoneventsupport.pCP->Release();if(FAILED(hr))returnFALSE;...returnTRUE;...在此,RecordsetEvent類的事件會(huì)被打開(kāi)并且在Recordset事件出現(xiàn)時(shí)方法將被調(diào)用。此后,如果您想使事件處理程序無(wú)效,可以再次獲取連接點(diǎn)并發(fā)出IConnectionPoint::UnAdvise方法。...hr=pCP->UnAdvise(dwEvtClass);//Turnoffeventsupport.pCP->Release();if(FAILED(hr))returnFALSE;...當(dāng)然,必須在適當(dāng)?shù)臅r(shí)候釋放接口并毀掉類的對(duì)象。VisualJ++importwfc.data.*;publicclassMyClass{ConnectionEventHandlerhandler=newConnectionEventHandler(this,"onConnectComplete");publicvoidonConnectComplete(Objectsender,ConnectionEvente){if(e.adStatus==AdoEnums.EventStatus.ERRORSOCCURRED)System.out.println("Connectionfailed");elseSystem.out.println("Connectioncompleted");return;}voidmain(void){Connectionconn=newConnection();conn.addOnConnectComplete(handler);//打開(kāi)事件支持。conn.open("DSN=pubs");conn.close();conn.removeOnConnectComplete(handler);//關(guān)閉事件支持。}}VBScriptVBScript不支持事件。VC++ExtensionsforADO用ADO恢復(fù)數(shù)據(jù)時(shí),VisualC++程序員所面對(duì)的一個(gè)最冗長(zhǎng)而乏味的工作是必須將以VARIANT數(shù)據(jù)類型返回的數(shù)據(jù)轉(zhuǎn)換為C++數(shù)據(jù)類型,然后將轉(zhuǎn)換后的數(shù)據(jù)存入類或結(jié)構(gòu)中。除繁瑣外,通過(guò)VARIANT數(shù)據(jù)類型恢復(fù)C++數(shù)據(jù)會(huì)降低性能。ADO提供的接口支持直接將數(shù)據(jù)恢復(fù)到C/C++自有數(shù)據(jù)類型中,而不通過(guò)VARIANT的轉(zhuǎn)換。并提供預(yù)處理宏簡(jiǎn)化對(duì)接口的使用。由此獲得一個(gè)高效易用的靈活工具。普通C/C++客戶端方案將Recordset中的記錄綁定到包含自有C/C++類型的C/C++結(jié)構(gòu)/類上。使用VARIANT時(shí),將涉及編寫從VARIANT到C/C++自有類型的轉(zhuǎn)換代碼。ADOVC++Extensions的目的便是使VC++程序員更容易地實(shí)現(xiàn)該方案。使用ADOVC++Extensions定義綁定條目ADOVC++Extensions可將Recordset對(duì)象的字段映射到C/C++變量,對(duì)字段與變量之間映射關(guān)系的定義稱為“綁定條目”。預(yù)處理宏用來(lái)定義數(shù)值、定長(zhǎng)和變長(zhǎng)變量的綁定條目。將BEGIN_ADO_BINDING和END_ADO_BINDING宏之間的綁定條目用括號(hào)括起。不要在綁定條目結(jié)尾使用逗號(hào)或分號(hào),這些定界符僅限在宏中使用。為每個(gè)將被轉(zhuǎn)換為C/C++變量的字段指定一個(gè)綁定條目。使用適當(dāng)?shù)腁DO_FIXED_LENGTH_BINDING_ENTRY、ADO_NUMERIC_BINDING_ENTRY或ADO_VARIABLE_LENGTH_BINDING_ENTRY宏。在宏的參數(shù)中,用序數(shù)指定將被提出的Recordset字段—0標(biāo)識(shí)第一字段,1標(biāo)識(shí)第二字段,依此類推。使用數(shù)據(jù)類型聲明C/C++變量。如果變量為數(shù)值,也可指定精度和范圍。如果變量為變長(zhǎng)變量(如字符串),則必須以字節(jié)指定變量的最大尺寸。如果需要,Recordset字段值可被強(qiáng)制為該數(shù)據(jù)類型。指定臨時(shí)的工作緩沖區(qū),用來(lái)將字段值從VARIANT轉(zhuǎn)換為C/C++變量。緩沖區(qū)應(yīng)至少與此C/C++變量一樣大。將布爾型修改參數(shù)設(shè)置為TRUE使ADO可更新綁定的字段,如只檢查字段而不將其更改,可設(shè)置為FALSE。VC++Extensions不保留有關(guān)字段的狀態(tài)信息,因此必須指定ADO是否更改字段值(例如,由數(shù)據(jù)源保留的自動(dòng)增值字段的值)。因此該字段的修改參數(shù)應(yīng)設(shè)置為FALSE。狀態(tài)參數(shù)可告訴您從Recordset字段到C或C++變量的轉(zhuǎn)換是否成功以及變量的內(nèi)容是否有效。該參數(shù)的兩個(gè)最重要的值是adFldOK(意味著轉(zhuǎn)換成功)和adFldNull(意味著字段是NULL—無(wú)值可供轉(zhuǎn)換)。首先檢測(cè)該參數(shù)以決定C或C++變量是否有效。例如,如果字段具有有效的行內(nèi)容,狀態(tài)將會(huì)是adFldOK;如果移動(dòng)到另一個(gè)字段為NULL的行,狀態(tài)則將是adFldNull。然而,C或C++變量的內(nèi)容將不被更改—該變量將仍然包含上一行的字段值。將Recordset綁定到變量在應(yīng)用程序中,調(diào)用BindToRecordset接口方法可使Recordset字段關(guān)聯(lián)(或綁定)到C/C++變量,無(wú)論何時(shí)更改Recordset對(duì)象的當(dāng)前行,C/C++變量都將自動(dòng)更新。頭文件要使用VC++Extensions,請(qǐng)?jiān)趹?yīng)用程序中包含如下文件:#include<icrsint.h>接口方法IADORecordBinding接口具有使Recordset字段與C/C++變量關(guān)聯(lián)、添加新行和執(zhí)行更新的方法。所有這三個(gè)方法都可使指針指向由CADORecordBinding派生的類,該CADORecordBinding定義每個(gè)字段和變量之間的綁定。接口方法是:BindToRecordset(&binding)調(diào)用該方法可使變量與字段相關(guān)聯(lián)。AddNew(&binding)調(diào)用該方法可間接調(diào)用ADOAddNew方法。Update(&binding)調(diào)用該方法可間接調(diào)用ADOUpdate方法。預(yù)處理宏BEGIN_ADO_BINDING(cls)ADO_FIXED_LENGTH_BINDING_ENTRY(Ordinal,DataType,Buffer,Status,Modify)ADO_NUMERIC_BINDING_ENTRY(Ordinal,DataType,Buffer,Precision,Scale,

Status,Modify)ADO_VARIABLE_LENGTH_BINDING_ENTRY(Ordinal,DataType,Buffer,Size,

Status,Modify)END_ADO_BINDING()參數(shù)說(shuō)明cls類,定義綁定條目,緩沖區(qū),和Recordset對(duì)象。Ordinal按順序的字段號(hào)碼,0標(biāo)識(shí)第一字段,1標(biāo)識(shí)第二字段,依此類推。DataType儲(chǔ)存已轉(zhuǎn)換字段的變量的數(shù)據(jù)類型。Buffer緩沖區(qū),用于將字段轉(zhuǎn)換為變量。Status指示字段轉(zhuǎn)換是否成功。Modify布爾標(biāo)志;如果為TRUE,則表明ADO可以更新關(guān)聯(lián)的字段。Precision在數(shù)值變量中可被表現(xiàn)出的數(shù)字位數(shù)。Scale位于數(shù)值變量中的小數(shù)點(diǎn)后的位數(shù)。Size變長(zhǎng)變量所需的字節(jié)數(shù),諸如:字符串。狀態(tài)參數(shù)值說(shuō)明adFldOK返回非NULL字段值。adFldBadAccessor綁定無(wú)效。adFldCantConvertValue由于符號(hào)不匹配和數(shù)據(jù)溢出以外的原因,值不能轉(zhuǎn)換。adFldNull返回NULL。adFldTruncated變長(zhǎng)數(shù)據(jù)或數(shù)值型數(shù)字被截短。adFldSignMismatch值有符號(hào),而變量數(shù)據(jù)類型無(wú)符號(hào)。adFldDataOverFlow值大于在變量數(shù)據(jù)類型中的存儲(chǔ)大小。adFldCantCreate已打開(kāi)未知列類型和字段。adFldUnavailable無(wú)法確定字段值—例如在無(wú)默認(rèn)值的新建、未指定的字段中。adFldPermissionDenied更新時(shí),不允許寫入數(shù)據(jù)。adFldIntegrityViolation更新時(shí),字段值將破壞列的完整性。adFldSchemaViolation更新時(shí),字段值將破壞列模式。adFldBadStatus更新時(shí),無(wú)效的狀態(tài)參數(shù)。adFldDefault更新時(shí),使用了默認(rèn)值。VC++Extensions頭文件的詳細(xì)資料下列頭文件(icrsint.h)詳細(xì)說(shuō)明了允許客戶提取一行數(shù)據(jù)并直接送至類數(shù)據(jù)成員的接口??蛻舫绦蛐枰谄漕愔邪壎l目,以指定RecordsetField對(duì)象和類數(shù)據(jù)成員之間的關(guān)聯(lián)。#ifndef_ICRSINT_H_#define_ICRSINT_H_#include<olectl.h>#include<stddef.h>//forwardsclassCADORecordBinding;#defineclassoffset(base,derived)\((DWORD)(static_cast<base*>((derived*)8))-8)enumFieldStatusEnum{adFldOK=0,adFldBadAccessor=1,adFldCantConvertValue=2,adFldNull=3,adFldTruncated=4,adFldSignMismatch=5,adFldDataOverFlow=6,adFldCantCreate=7,adFldUnavailable=8,adFldPermissionDenied=9,adFldIntegrityViolation=10,adFldSchemaViolation=11,adFldBadStatus=12,adFldDefault=13};typedefstructstADO_BINDING_ENTRY{ULONGulOrdinal;WORDwDataType;BYTEbPrecision;BYTEbScale;ULONGulSize;ULONGulOffSet;ULONGulIADOBindingEntriesOffSet;ULONGulFldStatusOffset;BOOLfModify;}ADO_BINDING_ENTRY;#defineBEGIN_ADO_BINDING(cls)public:\typedefclsADORowClass;\constADO_BINDING_ENTRY*STDMETHODCALLTYPEGetADOBindingEntries(){\staticconstADO_BINDING_ENTRYrgADOBindingEntries[]={#defineADO_FIXED_LENGTH_BINDING_ENTRY(Ordinal,DataType,Buffer,\Status,Modify)\{Ordinal,\DataType,\0,\0,\0,\offsetof(ADORowClass,Buffer),\classoffset(CADORecordBinding,ADORowClass),\offsetof(ADORowClass,Status),\Modify},#defineADO_NUMERIC_BINDING_ENTRY(Ordinal,DataType,\Buffer,Precision,Scale,Status,Modify)\{Ordinal,\DataType,\Precision,\Scale,\0,\offsetof(ADORowClass,Buffer),\classoffset(CADORecordBinding,ADORowClass),\offsetof(ADORowClass,Status),\Modify},#defineADO_VARIABLE_LENGTH_BINDING_ENTRY(Ordinal,DataType,\Buffer,Size,Status,Modify)\{Ordinal,\DataType,\0,\0,\Size,\offsetof(ADORowClass,Buffer),\classoffset(CADORecordBinding,ADORowClass),\offsetof(ADORowClass,Status),\Modify},#defineEND_ADO_BINDING(){0,adEmpty,0,0,0,0,0,adFldOK,FALSE}};\retu

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論