VFP與SQL遠(yuǎn)程異構(gòu)數(shù)據(jù)庫(kù)

字號(hào):

熟悉 VFP的朋友都知道,在 VFP 里我們可以使用遠(yuǎn)程視圖 (Remote View) 和 SPT(SQL Pass Through) 技術(shù)控制遠(yuǎn)程異構(gòu)數(shù)據(jù)庫(kù)。這些技術(shù)其實(shí)是 VFP 對(duì) ODBC 的 API 的封裝,所以對(duì)于用戶來說訪問遠(yuǎn)程數(shù)據(jù)庫(kù)就像操作傳統(tǒng)的DBF一樣簡(jiǎn)單。關(guān)于這兩種技術(shù)的使用,完全可以洋洋灑灑地寫下一本書,鑒于本文主題及篇幅,這里僅枚舉 SPT 技術(shù)訪問遠(yuǎn)程數(shù)據(jù)的應(yīng)用。
       很多人認(rèn)為有了遠(yuǎn)程視圖這樣直觀、簡(jiǎn)單的工具,為什么還需要 SPT 呢?確實(shí) SPT 較遠(yuǎn)程視圖難以掌握,但細(xì)細(xì)體會(huì)你會(huì)發(fā)現(xiàn):遠(yuǎn)程視圖其實(shí)是對(duì) SPT 的可視化工具!SPT 較遠(yuǎn)程視圖更具威力,遠(yuǎn)程視圖提供的功能只是 SPT 的一個(gè)子集。其優(yōu)勢(shì)和劣勢(shì)主要體現(xiàn)在以下幾個(gè)方面:
    l、SPT 的優(yōu)勢(shì)
    1) 一次得到多個(gè)Cursor;
    2) 執(zhí)行除 Select 以外的其他 SQL 語(yǔ)句,如 Insert、Update、Delete等;
    3) 執(zhí)行遠(yuǎn)程數(shù)據(jù)庫(kù)的存儲(chǔ)過程 ;
    4) 執(zhí)行遠(yuǎn)程數(shù)據(jù)庫(kù)的特殊函數(shù)、命令等 ;
    5) 事務(wù)管理 。
    2、SPT 的劣勢(shì)
    1) 沒有圖形用戶界面;
    2) 必須人工維護(hù)連接;
    3) 得到的Cursor默認(rèn)是“可讀寫”Cursor,要使它成為“可更新”Cursor必須經(jīng)過設(shè)置才行。
    下面就順著我們對(duì) SPT 的認(rèn)識(shí),來瀏覽一下這個(gè)偉大的工具吧!(注意:本文所有例程均使用 SQL Server的NorthWind 數(shù)據(jù)庫(kù)演示)。
    管理連接
    l、建立連接
    注意:本文所有示例的代碼若用到連接的,默認(rèn)采用“建立連接”代碼中產(chǎn)生的連接句柄 “CON”。
    WAIT ' 連接到 SQL Server 上去 ' NOWAIT NOCLEAR WINDOW
    SQLSETPROP(0,"DispLogin" ,3) &&&& 設(shè)置環(huán)境為“從不顯示 ODBC 登錄對(duì)話框”。
    CON=SQLSTRINGCONNECT("driver=SQL Server;Server=BOE;Uid=sa;pwd=;database=northwind")
    *假定 SQL Server 服務(wù)器名為 BOE, 用戶 ID 是sa, 口令是空串
    *如果你的 SQL Server 的服務(wù)器名, 用戶 ID, 口令與上不同,請(qǐng)修改以上代碼中的相關(guān)部分以符合你系統(tǒng)中的設(shè)置
    WAIT clear
    IF con<=0
    MESSAGEBOX(' 連接失敗 ',64,' 連接到 SQL Server 上去 ')
    ELSE
    MESSAGEBOX(' 連接成功 ',64,' 連接到 SQL Server 上去 ')
    ENDIF
    2、斷開連接
    SQLDISCONNECT(CON)
    一次得到多個(gè)Cursor
    我們可以用一次 SPT 傳回多個(gè)Cursor,如下:
    cSQL="SELECT * FROM EMPLOYEES"+CHR(10)+"SELECT * FROM CUSTOMERS"+CHR(10)+"SELECT * FROM PRODUCTS"
    ?SQLEXEC(con,cSQL,"TEMP")
    SQLEXEC( ) 的返回值表示Cursor的數(shù)量,這里返回 3 。這三個(gè)Cursor分別以 TEMP、TEMP1和TEMP2 命名。
    執(zhí)行其他 SQL 語(yǔ)句
    下面我們嘗試執(zhí)行SQL Server以外的SQL語(yǔ)句:
    cSQL="IF EXISTS(SELECT * FROM CUSTOMERSswheres CUSTOMERID='TEST')"
    cSQL=cSQL+" DELETE FROM CUSTOMERSswheres CUSTOMERID='TEST'" cSQL=cSQL+" ELSE INSERT CUSTOMERS(CUSTOMERID,COMPANYNAME) VALUES('TEST',' 這是一個(gè)測(cè)試! ')"
    IF SQLEXEC(CON,cSQL)<=0
    MESSAGEBOX(' 執(zhí)行失敗 ',64,' 發(fā)送語(yǔ)句到 SQL Server 上去 ')
    ELSE
    MESSAGEBOX(' 執(zhí)行成功 ',64,' 發(fā)送語(yǔ)句到 SQL Server 上去 ')
    ENDIF