很多人認(rèn)為有了遠(yuǎ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)勢和劣勢主要體現(xiàn)在以下幾個(gè)方面:
l、spt 的優(yōu)勢
1) 一次得到多個(gè)cursor;
2) 執(zhí)行除 select 以外的其他 sql 語句,如 insert、update、delete等;
3) 執(zhí)行遠(yuǎn)程數(shù)據(jù)庫的存儲(chǔ)過程 ;
4) 執(zhí)行遠(yuǎn)程數(shù)據(jù)庫的特殊函數(shù)、命令等 ;
5) 事務(wù)管理 。
2、spt 的劣勢
1) 沒有圖形用戶界面;
2) 必須人工維護(hù)連接;
3) 得到的cursor默認(rèn)是“可讀寫”cursor,要使它成為“可更新”cursor必須經(jīng)過設(shè)置才行。
下面就順著我們對(duì) spt 的認(rèn)識(shí),來瀏覽一下這個(gè)偉大的工具吧!(注意:本文所有例程均使用 sql server的northwind 數(shù)據(jù)庫演示)。
管理連接
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 語句
下面我們嘗試執(zhí)行sql server以外的sql語句:
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è)測試! /')"
if sqlexec(con,csql)<=0
messagebox(/' 執(zhí)行失敗 /',64,/' 發(fā)送語句到 sql server 上去 /')
else
messagebox(/' 執(zhí)行成功 /',64,/' 發(fā)送語句到 sql server 上去 /')
endif
行文至此,也許有朋友會(huì)問:如果 sql 語句中 customerid 是一個(gè)變量怎么辦呢?其實(shí) 我們可以通過兩個(gè)常用的解決方案來解決:
1、拼接字符串
custid=/'test/'
csql="if exists(select * from customersswheres customerid=/'"+custid+"/')"
csql=csql+" delete from customers swherescustomerid=/'"+custid+"/'"
csql=csql+" else insert customers(customerid,companyname) values(/'"+custid+"/',/' 這是一個(gè)測試! /')"
?sqlexec(con,csql)
2、spt 標(biāo)準(zhǔn)變量傳遞法
custid=/'test/'
csql="if exists(select * from customersswherescustomerid=?custid)"
csql=csql+" delete from customersswherescustomerid=?custid"
csql=csql+" else insert customers(customerid,companyname) values(?custid,/' 這是一個(gè)測試! /')"
?sqlexec(con,csql)
特殊函數(shù)和命令
如果在 sql server 中你有足夠的權(quán)限,通過 spt 使用遠(yuǎn)程數(shù)據(jù)庫的特殊函數(shù)和命令,你可以完全控制 sql server ,這里我們就演示“怎樣取得數(shù)據(jù)庫服務(wù)器的時(shí)間”:
?sqlexec(con,"select getdate() as serverdatetime","temp1")
?temp1.serverdatetime
use in ("temp1")
事務(wù)管理
在一些復(fù)雜的應(yīng)用中,往往會(huì)有一項(xiàng)操作影響幾個(gè)表的情況。就客戶端來說,發(fā)送到遠(yuǎn)程數(shù)據(jù)庫的數(shù)據(jù)變動(dòng)可能來源很多:表緩沖的多行記錄的變動(dòng),行緩沖的單行記錄變化,以及前文我們演示的直接用 sql 語句傳遞的數(shù)據(jù)維護(hù),林林總總……怎樣把這些更新行為控制在一個(gè)事務(wù)中呢!要么一起成功,要么一起回滾。
csql="delete from customersswherescustomerid=/'blaus/'"+chr(10)
csql=csql+"insert customers(customerid,companyname) values(/'test1/',/' 這是一個(gè)測試! /')"
sqlsetprop(con,"transactions" ,2)&&&& 開始一個(gè)事務(wù)
ireturn=sqlexec(con,csql)
if ireturn=1
sqlcommit(con)&&&& 事務(wù)交付
else
sqlrollback(con)&&&& 事務(wù)回滾
endif
sqlsetprop(con,"transactions" ,1)&&&& 重新回到自動(dòng)事務(wù)處理狀態(tài)
&&&&就本例而言,“delete from customersswheres customerid=/'blaus/'”總是不能執(zhí)行的,sql server會(huì)返回出錯(cuò)揭示:
&&&&delete statement conflicted with column reference constraint /'fk_orders_customers/'.
&&&&the conflict occurred in database /'northwind/', table /'orders/', column /'customerid/'.
&&&&所以這筆事務(wù)總是被回滾的!!
從例程中可以看到,我們開啟的事務(wù)其實(shí)是針對(duì)“連接”的,也就是說通過該“連接”的所有數(shù)據(jù)更新都包含于事務(wù)中,直到事務(wù)被回滾或交付。
sqlsetprop(con,"transactions" ,2 ), 其實(shí)是開啟了人工事務(wù)處理,也就是說必須由用戶明確地給出交付或者回滾指令,事務(wù)才會(huì)結(jié)束。所以筆者以為:完成一筆事務(wù)以后,應(yīng)執(zhí)行 sqlsetprop(con,"transactions" ,1 ) 將“連接”的事務(wù)模式設(shè)為默認(rèn)的“自動(dòng)”,這樣可以防止用戶陷入未知的事務(wù)中去。
spt的基本操作還不止這些,以后我們還會(huì)為讀者朋友介紹其他一些基本操作。如果朋友們能掌握這些基本操作,就能編寫不錯(cuò)的 c/s 程序了。雖然本文是用 sql server 作為遠(yuǎn)程數(shù)據(jù)庫,但是如果你使用 db2和oracle等,在 vfp 中也可以進(jìn)行同樣的處理。
本文開始已提到 vfp 在這方面的內(nèi)容很廣泛,寥寥千言當(dāng)然不能盡言,有興趣的朋友可以去訪問www.boeworks.com,以便查閱更多的內(nèi)容。ok,希望有機(jī)會(huì)與大家一起討論這方面的問題。
新聞熱點(diǎn)
疑難解答
圖片精選