深入CursorAdapter(二)

字號:

考試大計(jì)算機(jī)等級站整理:
    在 VFP8 中新增的 CursorAdapter 基類提供一個(gè)統(tǒng)一、易用的數(shù)據(jù)接口。Doug Hennig 在這個(gè)月的文章中演示了怎樣使用 CursorAdapter 來訪問本地?cái)?shù)據(jù)和 ODBC、ADO和XML這樣的遠(yuǎn)程數(shù)據(jù)——討論了使用各種數(shù)據(jù)源相應(yīng)的特殊要求和實(shí)現(xiàn)途徑。
    正文:
    如我在上一篇文章中所提到的那樣,在VFP8中一個(gè)最重要的、也是最精彩的新功能是新的 CursorAdapter 基類。在那篇文章中,我們研究了一下 CursorAdapter 的屬性、事件和方法,并討論了它相對于遠(yuǎn)程視圖、SQL PassThrough(SPT)、ADO和XML的優(yōu)勢。
    在開始使用 CursorAdapter 之前,你需要根據(jù)要訪問的是本地?cái)?shù)據(jù)還是通過ODBC、ADO或者XML的遠(yuǎn)程數(shù)據(jù)源的不同,注意這個(gè)類所相應(yīng)的不同的特殊要求。這個(gè)月的文章就講述了使用各種數(shù)據(jù)源的細(xì)節(jié)。
    使用本地?cái)?shù)據(jù)源
    ×××××××
    盡管我們很清楚 CursorAdapter 是試圖用來標(biāo)準(zhǔn)化和簡化對非VFP數(shù)據(jù)的訪問方式的,不過你還是可以把它當(dāng)作是 Cursor 的代替品用它來訪問VFP數(shù)據(jù):只要把它的 DataSourceType 屬性設(shè)置成 "Native"。為什么要這么做呢?因?yàn)槟愕膽?yīng)用程序?qū)砜赡軙枰w——那時(shí)候你就可以把 DataSourceType 屬性設(shè)置成其它幾個(gè)選項(xiàng)之一(當(dāng)然可能還需要修改其它幾個(gè)屬性,例如設(shè)置連接信息等等),就能輕松的切換到另一種數(shù)據(jù)庫引擎,例如SQL Server。
    當(dāng) DataSourceType 屬性的設(shè)置為 "Native" 的時(shí)候,VFP 會忽略它的 DataSource 屬性。SelectCmd 屬性必須是一個(gè) SQL Select 語句(而不是一個(gè) USE 命令或表達(dá)式),這就意味著你用 CursorAdapter 不是直接操作本地表而是操作一個(gè)類似于本地視圖那樣的東西。你還必須確保VFP能夠找到出現(xiàn)在那個(gè) Select 語句中的任何表,因此,如果這些表不在當(dāng)前路徑中,那么你就需要設(shè)置一下路徑或者打開這些表所屬的數(shù)據(jù)庫。此外,就跟用視圖一樣,如果你想讓這個(gè) Cursor 是可更新的,你還必須設(shè)置好那些與更新相關(guān)的屬性(KeyFieldList、Tables、UpdatableFieldlist 和 UpdateNameList)。
    下面的例子(文章附件 NativeExample.prg)會用 VFP 示例數(shù)據(jù)庫中的 Customer 表建立一個(gè)可更新的 Cursor:
    local loCursor as CursorAdapter, laErrors[1]
    Open database (_samples + 'data\testdata')
    with loCursor
    .Alias = 'customercursor'
    .DataSourceType = 'Native'
    .SelectCmd = "Select CUST_ID, COMPANY, CONTACT FROM CUSTOMER " +
    "WHERE COUNTRY = 'Brazil'"
    .KeyFieldList = 'CUST_ID'
    .Tables = 'CUSTOMER'
    .UpdatableFieldList = 'CUST_ID, COMPANY, CONTACT'
    .UpdateNamelist = 'CUST_ID CUSTOMER.CUST_ID, '+
    'COMPANY CUSTOMER.COMPANY, CONTACT CUSTOMER.CONTACT'
    if .CursorFill()
    browse
    tableupdate(1)
    else
    aerror(laErrors)
    messagebox(laErrors[2])
    endif .CursorFill()
    endwith
    close databases all
    使用 ODBC
    ×××××
    ODBC 是 DataSourceType 屬性四種設(shè)置中最簡單的一種。把 DataSource 設(shè)置為一個(gè)打開了的 ODBC 連接句柄、設(shè)置一下常用的屬性、然后調(diào)用 CursorFill 來取得數(shù)據(jù)。如果你設(shè)好了 KeyFieldList、Tables、UpdatableFieldList 和 UpdateNameList 屬性,VFP 會自動把你對數(shù)據(jù)的任何改動轉(zhuǎn)換成相應(yīng)的 UPDATE、INSERT、和 DELETE 語句來把改動提交到后臺數(shù)據(jù)源。如果你想用的是一個(gè)存儲過程,那么要相應(yīng)的設(shè)置 *Cmd、*CmdDataSource 和 *CmdDataSourceType 屬性(* 代表 “Delete”、“Insert”或“Update”)。
    這里是附件 ODBCExample.prg 中的一個(gè)例子,它調(diào)用 Sql Server 自帶的 NorthWind 數(shù)據(jù)庫中的 CustOrderHist 存儲過程來取得銷售給某個(gè)客戶的單位產(chǎn)品總數(shù)。
    local lcConnString, loCursor as CursorAdapter, laErrors[1]
    lcConnString = 'driver=SQL Server;server=(local);database=Northwind;uid=sa;pwd=;"+
    "trusted_connection=no'
    ** 把上面連接字符串中的密碼改成你的SQL Server 登錄的密碼
    loCursor = createobject('CursorAdapter')
    with loCursor
    .Alias = 'Customerhistory'
    .DataSourceType = 'ODBC'
    .DataSource = SQLStringConnect(lcConnString)
    .SelectCmd = "exec CustOrderhist 'ALFKI'"
    if .CursorFill()
    browse
    else
    aerror(laErrors)
    messagebox(laErrors[2])
    endif .CursorFill()
    endwith