熟悉 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
很多人認(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