深入CursorAdapter(三)

字號(hào):

考試大計(jì)算機(jī)等級(jí)站整理:
    VFP 的程序員們想要一個(gè)可重用的數(shù)據(jù)類(lèi)已經(jīng)很久了。盡管在過(guò)去的版本中也有許多解決這個(gè)問(wèn)題的辦法,不過(guò)總是有點(diǎn)美中不足。現(xiàn)在在 VFP 8里,我們有了真正的可重用數(shù)據(jù)類(lèi)。這個(gè)月,Doug 為我們演示了怎樣通過(guò)建立 CursorAdapter 和 DataEnvironment 的子類(lèi)來(lái)建立可重用的數(shù)據(jù)類(lèi)、以及怎樣在表單和報(bào)表中使用它們。
    正文
    ××
    在過(guò)去的兩期雜志中,我們討論了在 VFP 8 中新增的 CursorAdapter 基礎(chǔ)類(lèi)。我個(gè)人的觀點(diǎn)是,這是 VFP 8 中最重要的改動(dòng)之一,因?yàn)樗蛭覀兲峁┝艘粋€(gè)對(duì)象SQL Server這樣的非VFP數(shù)據(jù)源的簡(jiǎn)單易用、統(tǒng)一的接口。此外,如你本月所能見(jiàn)到的那樣,它們還形成了可重用數(shù)據(jù)類(lèi)的基礎(chǔ)。
    在講述可重用數(shù)據(jù)類(lèi)之前,讓我們先來(lái)看一下我建立的一些 CursorAdapter 和 DataEnvironment 的子類(lèi),我給它們?cè)黾恿艘恍╊~外的功能,它們將成為我們的可重用數(shù)據(jù)類(lèi)的起點(diǎn)。
    SFCursorAdapter
    SFCursorAdapter (在附件 SFDataClasses.vcx 中) 是 CursorAdapter 的一個(gè)子類(lèi),它擁有一些額外增加的功能,如下:
    ※ 它可以自動(dòng)處理參數(shù)化查詢(xún):你可以靜態(tài)(一個(gè)常量)也可以動(dòng)態(tài)(一個(gè)表達(dá)式,例如“=Thisform.txtName.value”,當(dāng) Cursor 被打開(kāi)或者刷新的時(shí)候,這個(gè)表達(dá)式會(huì)被運(yùn)算)的定義一個(gè)參數(shù)值。
    ※ 它可以在 Cursor 被打開(kāi)以后自動(dòng)在該 Cursor 上建立索引。
    ※ 對(duì)于 ADO,它還會(huì)執(zhí)行一些特殊的工作,例如把 DataSource 屬性設(shè)置為一個(gè) ADO RecordSet,把這個(gè) RecordSet 的 ActiveConnection 屬性設(shè)置為一個(gè) ADO Connection 對(duì)象,當(dāng)用到一個(gè)參數(shù)化查詢(xún)的時(shí)候,它還會(huì)建立一個(gè) ADO Command 對(duì)象并把這個(gè)對(duì)象傳遞給 CursorFill 方法。
    ※ 它提供了簡(jiǎn)單的錯(cuò)誤處理(cErrorMessage 屬性里會(huì)有錯(cuò)誤的信息)。
    ※ 它還有 CursorAdapter 中缺少的 Update 和 Release 方法。
    這個(gè)類(lèi)的 INIT 方法建立兩個(gè)集合(使用新的 Collection 基礎(chǔ)類(lèi),它是維護(hù)某些東西的集合用的),一個(gè)是為 SelectCmd 屬性可能會(huì)用到的參數(shù)而準(zhǔn)備的,另一個(gè)是用于在 Cursor 被打開(kāi)以后應(yīng)該自動(dòng)建立的標(biāo)記。它還會(huì) SET MULTILOCK ON,因?yàn)檫@是 CursorAdapter Cursor 的需求。
    This.oParameters = CreateObject('Collection')
    This.oTags = CreateObject('Collection')
    Set multilocks on
    AddParameter 方法象 parameters 集合添加一個(gè)參數(shù)。給這個(gè)方法傳遞參數(shù)的名稱(chēng)(這個(gè)名稱(chēng)應(yīng)該與該參數(shù)出現(xiàn)在 SelectCmd 屬性中的那個(gè)名稱(chēng)相一致),根據(jù)需要也可以付上參數(shù)的值(如果你現(xiàn)在不給它傳遞參數(shù)的值,也可以以后再調(diào)用 Getparameter 方法來(lái)傳遞)。這段代碼演示了一對(duì) VFP 8 中的新功能:新的 empty 基礎(chǔ)類(lèi),它沒(méi)有任何屬性、事件或者方法,因此是建立一個(gè)輕量級(jí)的對(duì)象的理想選擇;還有 AddProperty() 函數(shù),它的作用跟 AddProperty 方法類(lèi)似,區(qū)別是它用于那些沒(méi)有這個(gè)方法的對(duì)象。
    lparameters tcName, tuvalue
    local loParameter
    loParameter = createobject('Empty')
    addproperty(loParmeter, 'Name', tcName)
    addproperty(loParmeter, 'value', tuvalue)
    This.oParameters.Add(loParameter, tcName)
    使用 GetParmeter 方法來(lái)返回一個(gè)特殊的 parameter 對(duì)象——通常是用在需要設(shè)置用于參數(shù)的值的時(shí)候。
    lparameters tcName
    local loParameter
    loParameter = This.oParameters.Item(tcName)
    return loParameter
    SetConnection 方法用于將 DataSource 屬性設(shè)置為希望的連接。如果 DataSourceType 是 “ODBC”,就給這個(gè)方法傳遞一個(gè)連接句柄;如果是“ADO”,DataSource 必須是一個(gè)ADO Recordset 對(duì)象,而且該對(duì)象的 ActiveConnection 屬性必須要設(shè)置為一個(gè)活動(dòng) ADO Connection 對(duì)象,所以,我們需要向 SetConnection 方法傳遞這個(gè) ADO Connection 對(duì)象, SetConnection 會(huì)建立一個(gè) RecordSet,并且把這個(gè) RecordSet 的 ActiveConnection 設(shè)置為被傳遞的 ADO Connection 對(duì)象。
    lparameters tuConnection
    with this
    do case
    case .DataSourceType = 'ODBC'
    .DataSource = tuConnection
    case .DataSourceType = 'ADO'
    .DataSource = Createobject('ADODB.RecordSet')
    .DataSource.ActiveConnection = tuConnection
    endcase
    endwith