深入CursorAdapter(一)

字號(hào):

考試大計(jì)算機(jī)等級(jí)站整理:
    CursorAdapter 類(lèi)是 VFP 8 中最重要的新功能之一,因?yàn)樗峁┝艘环N簡(jiǎn)單易用、接口統(tǒng)一的訪(fǎng)問(wèn)遠(yuǎn)程數(shù)據(jù)源方式。在這個(gè)月的文章里,Dung Hennig 將向你展示 CursorAdapter 及它的工作方式。下個(gè)月,我們將再學(xué)習(xí)一些高級(jí)的用法。
    正文:越來(lái)越多的 VFP 程序員開(kāi)始把他們的數(shù)據(jù)儲(chǔ)存到象 SQL Server 或者 Oracle 這樣的 VFP 表以外的數(shù)據(jù)倉(cāng)庫(kù)中去了。有許多原因?qū)е铝诉@種情況,包括 VFP 表的脆弱性(不管是想象中的還是確實(shí)如此)、安全性、數(shù)據(jù)庫(kù)的容量、以及通用性的標(biāo)準(zhǔn)等等。MicroSoft 已經(jīng)在每一個(gè)版本中都使得訪(fǎng)問(wèn)非VFP數(shù)據(jù)更加的簡(jiǎn)單,為了鼓勵(lì)這種風(fēng)氣,它甚至在 VFP 7 光盤(pán)中自帶了 MSDE(Microsoft Data Engine,SQL Server 的一個(gè)免費(fèi)、簡(jiǎn)裝版)。
    不過(guò),訪(fǎng)問(wèn)一個(gè)后臺(tái)數(shù)據(jù)庫(kù)從來(lái)就比使用 VFP 表要麻煩一些,而你可以使用的機(jī)制則多得嚇人:
    ×× 遠(yuǎn)程視圖,它基于 ODBC 連接;
    ×× SQL Passthrough (SPT) 函數(shù),例如 SQLCONNECT()、SQLEXEC() 和 SQLDISCONNECT(),它們也基于 ODBC 連接;
    ×× ActiveX Data Objects ,簡(jiǎn)稱(chēng) ADO,它提供了一個(gè)對(duì)各種數(shù)據(jù)庫(kù)引擎的 OLE Provider 的一個(gè)面對(duì)對(duì)象訪(fǎng)問(wèn)方式;
    ×× XML,它是一個(gè)輕量級(jí)的、平臺(tái)無(wú)關(guān)的數(shù)據(jù)傳輸機(jī)制。
    如果你曾經(jīng)用這些機(jī)制上工作過(guò),有一件事情你可能已經(jīng)注意到了:它們中的每一種都各不相同。這樣的話(huà),你就必須一個(gè)個(gè)的學(xué)過(guò)來(lái),還要把一個(gè)已有的應(yīng)用程序從一種機(jī)制轉(zhuǎn)換到另一種機(jī)制,這可不是一件簡(jiǎn)單的工作。
    由于有了一個(gè)新的基礎(chǔ)類(lèi) CursorAdapter,在 VFP 8 中訪(fǎng)問(wèn)遠(yuǎn)程數(shù)據(jù)要比過(guò)去的版本中簡(jiǎn)單的多。以我之見(jiàn),CursorAdapter 是 VFP 8 最重要的新功能之一。我認(rèn)為它最棒的地方是:
    ×× 使用 ODBC、ADO、XML 變得非常容易,即時(shí)你不熟悉這些技術(shù)。
    ×× 不管你選擇了哪種遠(yuǎn)程數(shù)據(jù)源機(jī)制,它都提供一種統(tǒng)一的訪(fǎng)問(wèn)接口。
    ×× 從一種機(jī)制轉(zhuǎn)換到另一種機(jī)制變得非常的輕松。
    這里是上面的最后一個(gè)觀(guān)點(diǎn)的例子。假設(shè)你有一個(gè)使用 CursorAdapter 通過(guò) ODBC 來(lái)訪(fǎng)問(wèn) SQL Server 數(shù)據(jù)的應(yīng)用程序,由于某些原因你想要改成使用 ADO 了。對(duì)于這種情況,你只需要改動(dòng) CursorAdapter 的 DataSourceType 屬性、并改變對(duì)后臺(tái)數(shù)據(jù)庫(kù)的連接,就全部完成了。你的應(yīng)用程序中的其它部分不需要知道也不需要關(guān)心這些事情;它們看到的只是同一個(gè) Cursor 而不管使用了哪一種機(jī)制。
    屬性
    我們先從查看 CursorAdapter 的屬性、事件和方法開(kāi)始來(lái)學(xué)習(xí)它。這里不會(huì)討論所有的屬性,只談一下最重要的那些。
    DataSourceType
    這個(gè)屬性是最重要的:它決定了這個(gè)類(lèi)的表現(xiàn),以及要在其它一些屬性中要怎么設(shè)置??捎玫倪x項(xiàng)有“Native”——意思是使用 VFP 表——或者是 "ODBC"、"ADO" 或 "XML" ,表示你要選用的訪(fǎng)問(wèn)遠(yuǎn)程數(shù)據(jù)源的方式。
    DataSource
    這是訪(fǎng)問(wèn)數(shù)據(jù)的手段。當(dāng) DataSourceType 被設(shè)置成“Native”或者“XML”的時(shí)候,VFP會(huì)忽略這個(gè)屬性的設(shè)置。對(duì)于ODBC,請(qǐng)把這個(gè)屬性設(shè)置為一個(gè)有效的 ODBC 連接句柄(這意味著你要自己管理連接了)。在A(yíng)DO的情況下,DataSource 必須是一個(gè) ADO RecordSet,而且它的 ActiveConnection 對(duì)象必須被設(shè)置為一個(gè)打開(kāi)的 ADO Connection 對(duì)象(你又要自己管理這些了)。
    UseDEDataSource
    如果這個(gè)屬性被設(shè)置成了 .T.(默認(rèn)是 .F.),你可以不管它的 DataSourceType 和 DataSource 屬性,因?yàn)?CursorAdapter 將使用 DataEnvironment 的屬性來(lái)代替( VFP 8 給 DataEnvironment 也增加了 DataSourceType 和 DataSource 屬性)。舉例來(lái)說(shuō),當(dāng)你想讓在一個(gè)數(shù)據(jù)環(huán)境中的所有 CursorAdapters 斗使用同一個(gè) ODBC 連接的時(shí)候,就可以把它設(shè)置為 .T.。
    SelectCmd
    除了 XML 的情況以外,這是一個(gè)用來(lái)取得數(shù)據(jù)的 SQL Select 命令。在 XML 的情況下,它可以或者是一個(gè)能夠被轉(zhuǎn)換為一個(gè) Cursor 的有效 XML 字符串(使用內(nèi)部的 XMLTOCURSOR() 調(diào)用),或者是一個(gè)能夠返回一個(gè)有效的 XML 字符串的表達(dá)式。
    CursorSchema
    這個(gè)屬性里保存的是 Cursor 的數(shù)據(jù)結(jié)構(gòu),格式就像你在用 CREATE CURSOR 命令的時(shí)候用的那樣。這是一個(gè)例子:CUST_ID C(6), COMPANY C(30), CONTACT C(30), CITY C(25)。盡管不設(shè)置這個(gè)屬性而讓 CursorAdapter 在自己建立 Cursor 去決定這個(gè)結(jié)構(gòu)也是可以的,不過(guò)如果你自己輸入的話(huà),它會(huì)工作的更好。如果 CursorSchema 是空的或者不正確,那么當(dāng)你打開(kāi)一個(gè)表單的數(shù)據(jù)環(huán)境的時(shí)候,就會(huì)要么彈出一個(gè)錯(cuò)誤,要么就不能通過(guò)從 CursorAdapter 中拖放字段到表單上來(lái)建立控件。幸運(yùn)的是,VFP 自帶的 CursorAdapter 生成器可以為你填充這個(gè)屬性。
    AllowDelete、AllowInsert、AllowUpdate 和 SendUpdates
    這些屬性的默認(rèn)值是 .T.,它們決定了是否可以刪除、插入和更新和改動(dòng)是否要被發(fā)送到數(shù)據(jù)源。
    KeyFieldList、 Tables、 UpdatableFieldList、和 UpdateNameList
    這些屬性的用途跟 CURSORSETPROP() 中用到的那些參數(shù)的用途是一樣的,如果你想讓 VFP 自動(dòng)將對(duì) Cursor 的改動(dòng)提交到數(shù)據(jù)源,這些屬性就是必須的。
    ×× KeyFieldList 是一個(gè)用逗號(hào)分隔的字段列表(不帶別名),這些字段組成 Cursor 的主關(guān)鍵字。Tables 是一個(gè)用逗號(hào)分隔的表名列表。
    ×× UpdatableFieldList 是一個(gè)用逗號(hào)分隔的可以被更新的字段名列表(不帶別名)。
    ×× UpdateNameList 是一個(gè)用逗號(hào)分隔的列表,它用來(lái)讓 Cursor 中的字段名與在表中的字段名相匹配。UpdateNameList 的格式就像 這樣:CURSORFIELDNAME1 TABLE.FIELDNAME1、CURSORFIELDNAME2 TABLE.FIELDNAME2 等等。注意:如果 UpdatableFieldList 不包含表的主鍵字段的名稱(chēng)(比如說(shuō)你不想讓用戶(hù)可以更新這個(gè)字段),在 UpdateNameList 還是必須要有這個(gè)字段,否則就不能更新。