vfp遠(yuǎn)程視圖與spt應(yīng)用詳解_第1頁
vfp遠(yuǎn)程視圖與spt應(yīng)用詳解_第2頁
vfp遠(yuǎn)程視圖與spt應(yīng)用詳解_第3頁
vfp遠(yuǎn)程視圖與spt應(yīng)用詳解_第4頁
vfp遠(yuǎn)程視圖與spt應(yīng)用詳解_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、vfp遠(yuǎn)程視圖與spt應(yīng)用詳解-遠(yuǎn)程視圖(Remote Views)與SPT(SQL pass through)是vfp為開發(fā)Client/Server程序提供的兩個內(nèi)置的解決方案,如果您更深入的應(yīng)用vfp,這兩部分的內(nèi)容是必須掌握的。由于內(nèi)容比較多,文章分成若干篇幾次發(fā)完。但個人認(rèn)為,遠(yuǎn)程視圖與spt又是不可分割的整體,雖然spt應(yīng)用得比較多,但若對遠(yuǎn)程視圖沒有比較深入的了解,我想你也不見得能用好spt。因此做了這個目錄,希望您能從遠(yuǎn)程視圖開始,逐步了解這兩個偉大的開發(fā)工具的使用。一、SPT詳解1二、用vfp與sql server構(gòu)建Client/Server應(yīng)用程序(SPT)(1)7三、用

2、vfp與sql server構(gòu)建Client/Server應(yīng)用程序(SPT)(2)22四、用vfp與sql server構(gòu)建Client/Server應(yīng)用程序(遠(yuǎn)程視圖)(1)25五、用vfp與sql server構(gòu)建Client/Server應(yīng)用程序(遠(yuǎn)程視圖)(2)30六、用vfp與sql server構(gòu)建Client/Server應(yīng)用程序(遠(yuǎn)程視圖)(3)34七、用vfp與sql server構(gòu)建Client/Server應(yīng)用程序(遠(yuǎn)程視圖)(4)39八、用vfp與sql server構(gòu)建Client/Server應(yīng)用程序(遠(yuǎn)程視圖)(5)48foxpro for graph對象全接觸(

3、1)52foxpro for graph對象全接觸(2)55用vfp動態(tài)生成數(shù)據(jù)網(wǎng)頁(一)60用vfp動態(tài)生成數(shù)據(jù)網(wǎng)頁(二)64一、SPT詳解 -說在前面熟悉 Fox 的朋友都知道,在 VFP 里我們可以使用遠(yuǎn)程視圖 (Remote View) 和 SPT(SQL Pass Through) 技術(shù)控制遠(yuǎn)程異構(gòu)數(shù)據(jù)庫。這些技術(shù)其實(shí)是 VFP 對 ODBC 的 API 的封裝,所以對于用戶來說訪問遠(yuǎn)程數(shù)據(jù)庫就像操作傳統(tǒng)的DBF一樣簡單。關(guān)于這兩種技術(shù)的使用,完全可以洋洋灑灑地寫下一本書,鑒于本文主題及篇幅,這里僅枚舉 SPT 技術(shù)訪問遠(yuǎn)程數(shù)據(jù)的應(yīng)用。SPT與遠(yuǎn)程視圖很多人搞不懂有了遠(yuǎn)程視圖這樣直觀

4、、簡單的工具,為什么還需要 SPT 呢?確實(shí) SPT 較遠(yuǎn)程視圖難以掌握,但細(xì)細(xì)體會你會發(fā)現(xiàn):遠(yuǎn)程視圖其實(shí)是對 SPT 的可視化工具!SPT 較遠(yuǎn)程視圖更具威力,遠(yuǎn)程視圖提供的功能只是 SPT 的一個子集。仔細(xì)探索兩者優(yōu)劣,我們發(fā)現(xiàn):SPT 的優(yōu)勢:1. 一次得到多個Cursor2. 執(zhí)行除 Select 以外的其他 SQL 語句,如 Insert、Update、Delete等3. 執(zhí)行遠(yuǎn)程數(shù)據(jù)庫的存儲過程 4. 執(zhí)行遠(yuǎn)程數(shù)據(jù)庫的特殊函數(shù)、命令 5. 事務(wù)管理SPT 的劣勢:1. 沒有圖形用戶界面 2. 必須人工維護(hù)連接3. 得到的Cursor默認(rèn)是"可讀寫"Cursor,

5、要使它成為"可更新"Cursor必須經(jīng)過設(shè)定下面就順著我們對 SPT 的認(rèn)識,來瀏覽一下這種偉大的工具吧?。ㄗ⒁猓罕疚乃欣叹褂?SQL Server的NorthWind 數(shù)據(jù)庫演示)管理連接:建立連接:(注意:本文所有示例代碼若用到連接的,默認(rèn)采用"建立連接"代碼中產(chǎn)生的連接句柄"con")WAIT ' 連接到 SQL Server 上去 ' NOWAIT NOCLEAR WINDOW SQLSETPROP(0,"DispLogin" ,3) && 設(shè)置環(huán)境為:"從不

6、顯示 ODBC 登陸對話框" con=SQLSTRINGCONNECT("driver=SQL Server;Server=BOE;Uid=sa;pwd=;database=northwind") *假定 SQL Server 服務(wù)器名為 BOE, 用戶 ID 是sa, 口令是空串*如果你的 SQL Server 的服務(wù)器名, 用戶 ID, 口令與上不同,請修改以上代碼中的相關(guān)部分以符合你系統(tǒng)中的設(shè)置WAIT clear IF con<=0 MESSAGEBOX(' 連接失敗 ',64,' 連接到 SQL Server 上去 '

7、;) ELSE MESSAGEBOX(' 連接成功 ',64,' 連接到 SQL Server 上去 ') ENDIF斷開連接: SQLDISCONNECT(con) 一次得到多個Cursor我們可以用一次 SPT 傳回多個Cursor,如下: cSQL="SELECT * FROM EMPLOYEES"+CHR(10)+"SELECT * FROM CUSTOMERS"+CHR(10)+"SELECT * FROM PRODUCTS" ?SQLEXEC(con,cSQL,"TEMP"

8、;) SQLEXEC( ) 的返回值表示Cursor的數(shù)量,這里返回 3 。這三個Cursor分別以: TEMP,TEMP1,TEMP2 命名。執(zhí)行除 SQL-Select 以外的 SQL 語句 cSQL="IF EXISTS(SELECT * FROM CUSTOMERS WHERE CUSTOMERID='TEST')" cSQL=cSQL+" DELETE FROM CUSTOMERS WHERE CUSTOMERID='TEST'" cSQL=cSQL+" ELSE INSERT CUSTOMERS(CU

9、STOMERID,COMPANYNAME) VALUES('TEST',' 這是一個測試! ')" IF SQLEXEC(CON,cSQL)<=0 MESSAGEBOX(' 執(zhí)行失敗 ',64,' 發(fā)送語句到 SQL Server 上去 ') ELSE MESSAGEBOX(' 執(zhí)行成功 ',64,' 發(fā)送語句到 SQL Server 上去 ') ENDIF 行文至此,也許有朋友會問:如果 SQL 語句中 CUSTOMERID 是一個變量怎么辦呢?有兩個常用的解決方案:拼接字符串 C

10、USTID='TEST' cSQL="IF EXISTS(SELECT * FROM CUSTOMERS WHERE CUSTOMERID='"+CUSTID+"')" cSQL=cSQL+" DELETE FROM CUSTOMERS WHERE CUSTOMERID='"+CUSTID+"'" cSQL=cSQL+" ELSE INSERT CUSTOMERS(CUSTOMERID,COMPANYNAME) VALUES('"+CUST

11、ID+"',' 這是一個測試! ')" ?SQLEXEC(CON,cSQL) SPT 標(biāo)準(zhǔn)變量傳遞法 CUSTID='TEST' cSQL="IF EXISTS(SELECT * FROM CUSTOMERS WHERE CUSTOMERID=?CUSTID)" cSQL=cSQL+" DELETE FROM CUSTOMERS WHERE CUSTOMERID=?CUSTID" cSQL=cSQL+" ELSE INSERT CUSTOMERS(CUSTOMERID,COMPANYN

12、AME) VALUES(?CUSTID,' 這是一個測試! ')" ?SQLEXEC(CON,cSQL)執(zhí)行遠(yuǎn)程數(shù)據(jù)庫的存儲過程 存儲過程的好處自是不必多言,下面就讓我們看看怎樣用 SPT 調(diào)用遠(yuǎn)程數(shù)據(jù)庫的存儲過程。下面我們演示的是 NorthWind 數(shù)據(jù)庫中的存儲過程" CustOrderHist ",它的作用是返回指定客戶關(guān)于產(chǎn)品的消費(fèi)數(shù)量合計(jì)。據(jù)我所知,這里有兩種書寫格式供大家選擇:使用 T-SQL 的寫法: CUSTID='VINET' ?SQLEXEC(CON,'EXEC CustOrderHist ?CUSTI

13、D','TEMP1') 使用 ODBC 的寫法: CUSTID='VINET' ?SQLEXEC(CON,'CALL CustOrderHist(?CUSTID)','TEMP2')存儲過程常常會需要返回一些變量,通用的方法就是使用輸出參數(shù)。在演示之前,我們先用 SPT 在 SQL Server 建立一個包含輸入、輸出參數(shù)的存儲過程。 cSQL="IF EXISTS(select * from sysobjects where id=object_id('MY_PROC') and OBJECTP

14、ROPERTY(id,'IsProcedure')=1)"cSQL=cSQL+" drop procedure MY_PROC " &&如果存儲過程My_proc已經(jīng)存在,就刪除它?SQLEXEC(con,cSQL)cSQL="CREATE PROCEDURE MY_PROC EmployeeID int,Desc varchar(100) output as /* 只支持尋找直接下屬 */"+chr(10) cSQL=cSQL+" DECLARE ROW INT"+chr(10) cSQL=

15、cSQL+" SELECT * FROM EMPLOYEES WHERE REPORTSTO=EMPLOYEEID"+chr(10) cSQL=cSQL+" SELECT ROW=ROWCOUNT"+chr(10) cSQL=cSQL+" IF ROW>0"+chr(10) cSQL=cSQL+" SELECT Desc=' 找到了 '+CAST(ROW AS VARCHAR(4) +' 位下屬 '"+chr(10) cSQL=cSQL+" ELSE SELECT D

16、esc=' 這是一位普通員工 '" ?SQLEXEC(con,cSQL) 使用 T-SQL 的寫法: EMPID=2 DESCRIPTION="" ?SQLEXEC(CON,'EXEC MY_PROC ?EMPID,?DESCRIPTION','TEMP1') ?DESCRIPTION 使用 ODBC 的寫法: EMPID=2 DESCRIPTION="" ?SQLEXEC(CON,'CALL MY_PROC(?EMPID,?DESCRIPTION)','TEMP2'

17、;) ?DESCRIPTION 執(zhí)行遠(yuǎn)程數(shù)據(jù)庫的特殊函數(shù)、命令如果在 SQL Server 中你有足夠的權(quán)限,通過 SPT 你可以完全控制 SQL Server ,這里我們演示"怎樣取得數(shù)據(jù)庫服務(wù)器的時間":?SQLEXEC(con,"select getdate() as serverdatetime","temp1") ?temp1.serverdatetime USE IN ("temp1") 事務(wù)管理 在一些復(fù)雜的應(yīng)用中,往往會有一項(xiàng)操作影響好幾個表的情況。就客戶端來說,發(fā)送到遠(yuǎn)程數(shù)據(jù)庫的數(shù)據(jù)變動可能來源很

18、多:表緩沖的多行記錄的變動,行緩沖的單行記錄變化,以及前文我們演示的直接用 SQL 語句傳遞的數(shù)據(jù)維護(hù),林林總總怎樣把這些更新行為控制在一個事務(wù)中要么-一起成功,要么一起回滾。cSQL="DELETE FROM CUSTOMERS WHERE CUSTOMERID='BLAUS'"+CHR(10) cSQL=cSQL+"INSERT CUSTOMERS(CUSTOMERID,COMPANYNAME) VALUES('TEST1',' 這是一個測試! ')" SQLSETPROP(CON,"Tran

19、sactions" ,2)&& 開始一個事務(wù) IRETURN=SQLEXEC(CON,cSQL) IF IRETURN=1 SQLCOMMIT(CON)&& 事務(wù)交付 ELSE SQLROLLBACK(CON)&& 事務(wù)回滾 ENDIF SQLSETPROP(CON,"Transactions" ,1)&& 重新回到自動事務(wù)處理狀態(tài) &&就本例而言,"DELETE FROM CUSTOMERS WHERE CUSTOMERID='BLAUS'"總是不

20、能執(zhí)行的,SQL Server會返回錯誤:&&DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_Orders_Customers'. &&The conflict occurred in database 'Northwind', table 'Orders', column 'CustomerID'.&&所以這筆事務(wù)總是被回滾的!從例程中我們看到,我們開啟的事務(wù)其實(shí)是針對"連接"的,

21、也就是說通過該"連接"的所有數(shù)據(jù)更新都包含于事務(wù)中,直到事務(wù)被回滾或交付。 SQLSETPROP(CON,"Transactions" ,2 ), 其實(shí)是開啟了人工事務(wù)處理,也就是說必須由用戶明確的給出交付或者回滾指令,事務(wù)才會結(jié)束。所以筆者以為:完成一筆事務(wù)以后,應(yīng)執(zhí)行 SQLSETPROP(CON,"Transactions" ,1 ) 將"連接"的事務(wù)模式設(shè)為默認(rèn)的"自動",這樣可以防止用戶陷入未知的事務(wù)中去。 設(shè)為可更新到目前為止,我們已經(jīng)演示了 6 個 SPT 專題了,除了第一個&qu

22、ot;連接管理"在遠(yuǎn)程視圖中能夠?qū)崿F(xiàn)之外,其余的遠(yuǎn)程視圖都無法實(shí)現(xiàn)。下面我們要討論一下怎樣把 SPT 傳回的結(jié)果集合設(shè)為"可更新",總的來說遠(yuǎn)程視圖提供的就是這個功能。 在默認(rèn)狀況下, SPT 從遠(yuǎn)程數(shù)據(jù)庫得到的Cursor是"可讀寫"的,即:可以對它進(jìn)行" Select 、 Update 、 Insert 、 Delete "的操作,但數(shù)據(jù)的變化不會反映到數(shù)據(jù)源。"可更新"Cursor的特色就是可以直接將客戶端的數(shù)據(jù)變動,自動生成一系列 SQL 描述更新遠(yuǎn)程數(shù)據(jù)庫。 實(shí)現(xiàn)"可讀寫"C

23、ursor到"可更新"Cursor必須經(jīng)歷以下五步的設(shè)置: 1. CURSORSETPROP("TABLES", 數(shù)據(jù)源表名 , 可更新Cursor名 ) 此步驟設(shè)定的是數(shù)據(jù)源里(SQL Server)待更新的表名,如果涉及多個表就這樣寫: CURSORSETPROP("TABLES","T1,T2","MyCursor") 。2. CURSORSETPROP("KEYFIELDLIST", 關(guān)鍵字段 , 可更新Cursor名 )此步驟是設(shè)定關(guān)鍵字段的,這個關(guān)鍵字段是可更新C

24、ursor的字段,而不是數(shù)據(jù)源里的字段。 3. CURSORSETPROP("UPDATABLEFIELDLIST", 可更新字段列表 , 可更新Cursor名 ) 此步驟設(shè)定的是在可更新Cursor里哪些字段的變動要被反映到數(shù)據(jù)源,即哪些字段時可更新的。 4. CURSORSETPROP("UPDATENAMELIST", 前后段字段對應(yīng)關(guān)系列表 , 可更新Cursor名 ) 此步驟設(shè)定數(shù)據(jù)源字段與可更新Cursor字段的對應(yīng)關(guān)系。 5. CURSORSETPROP("SENDUPDATES",.T., 可更新Cursor名 ) 這

25、個步驟是打開 SQL 發(fā)送開關(guān),最關(guān)鍵的一步。 為便于大家理解,現(xiàn)將以上五步實(shí)例化:例一:SQLEXEC(con,"select categoryid as id ,categoryname,description from categories","mycursor") SELECT mycursor CURSORSETPROP("Tables","categories","mycursor") CURSORSETPROP("KeyFieldList","id&q

26、uot;,"mycursor") CURSORSETPROP("UpdatableFieldList" ,"id,categoryname,description","mycursor") CURSORSETPROP("UpdateNameList","id categories.categoryid,categoryname categories.categoryname,"+; "description categories.description",

27、"mycursor") CURSORSETPROP("SendUpdates" ,.t.,"mycursor") 例二:SQLEXEC(con,"select ductid,ductname,a.unitprice,b.categoryid,b.categoryname,c.supplierid,"+; "panyname as suppliername,c.contactname"+; " from (products a inner join categorie

28、s b on a.categoryid=b.categoryid)"+; " inner join suppliers c on a.supplierid=c.supplierid","mycursor") SELECT mycursor CURSORSETPROP("Tables","products,categories,suppliers","mycursor") CURSORSETPROP("KeyFieldList","productid,cat

29、egoryid,supplierid","mycursor") CURSORSETPROP("UpdatableFieldList",+; "productid,productname,unitprice,categoryid,categoryname,supplierid,suppliername,contactname","mycursor") CURSORSETPROP("UpdateNameList","productid ductid,pro

30、ductname "+; "ductname,unitprice products.unitprice,"+; "categoryid categories.categoryid,categoryname categories.categoryname,"+; "supplierid suppliers.supplierid,suppliername panyname,contactname suppliers.contactname","mycursor") CURSORSETP

31、ROP("SendUpdates" ,.t.,"mycursor")行筆匆匆,終于把我認(rèn)識的 SPT 基本操作寫完了,掌握這些,已能編寫不錯的 C/S 程序。雖然,本文是用 SQL Server 作為遠(yuǎn)程數(shù)據(jù)庫,但是如果你使用 DB2 、 Oracle ,在 VFP 中也是一樣處理。本文來自編程入門網(wǎng):二、用vfp與sql server構(gòu)建Client/Server應(yīng)用程序(SPT)(1) -一些題外話 最近有一種好的現(xiàn)象越來越多的Visual FoxPro用戶開始注意到Client/Server應(yīng)用程序的重要性,他們開始安裝SQL Server了。作為

32、開發(fā)人員,我們沒有必要深入認(rèn)識SQL Server的種種(我個人以為那是數(shù)據(jù)庫管理員DBA的事情),我們要解決的是怎樣使Visual FoxPro與SQL Server在一起順利的運(yùn)行,怎樣發(fā)揮兩者的優(yōu)越特性?!斑h(yuǎn)程視圖”一章已經(jīng)涉及到了許多深層次的問題,但遺憾的是(可能是文章太過枯燥)很少有人關(guān)注它!筆者到現(xiàn)在還是認(rèn)為,“遠(yuǎn)程視圖”一文絕對是目前網(wǎng)絡(luò)上能得到的最好的簡體中文學(xué)習(xí)資料,沒有哪篇文章會為你深入介紹“更新沖突發(fā)生的原理”,沒有哪篇文章會為你講解“Visual FoxPro發(fā)送更新到SQL Server 的原理”,沒有哪篇文章會為你講解“各種連接屬性的意義”在國內(nèi)眾多Visual F

33、oxPro圖書中,我最喜歡的作者是臺灣的章立民先生。我個人以為Visual FoxPro的章立民、Delphi的李維、Visual Basic的王國榮是那種多數(shù)讀者看到是他們寫的作品就應(yīng)該買的那類作者。三位大家的書我都有拜讀,竊以為:文采最棒的是章立民先生,名氣最小的也是章立民先生(也許是因?yàn)閂isual FoxPro的關(guān)系)。中國鐵道出版社為國內(nèi)的Visual FoxPro事業(yè)做了一件好事在99年前后出版了章立民先生的四冊圖書,分別是:Visual FoxPro 6.X 中文版程序設(shè)計(jì)教學(xué)指南、Visual FoxPro 6.X 中文版程序設(shè)計(jì)基礎(chǔ)加強(qiáng)、Visual FoxPro 6.X 中

34、文版程序設(shè)計(jì)問題集、Visual Foxpro 6.X 中文版程序設(shè)計(jì)應(yīng)用實(shí)務(wù)。除了教學(xué)指南外,其余三本都是進(jìn)階應(yīng)用的好書,但很奇怪的是他們在市場上銷售的并不理想,直到今年上半年在上海書市中還能覓到,相反的一些粗制濫造的東西卻是賣得火爆,真是咄咄怪事!我不認(rèn)識章立民先生,與中國鐵道出版社更無關(guān)系,但我愿意為他們做廣告,如果章立民能為Visual FoxPro 7寫出更好的東西,我們將感激不盡,也希望國內(nèi)出版社積極參與引進(jìn)!本文在寫作上參考了Visual Foxpro 6.X 中文版程序設(shè)計(jì)應(yīng)用實(shí)務(wù)的內(nèi)容,但絕對不是抄襲,大家有興趣可以買一本讀上一讀。為什么要引入SPT的概念我們已經(jīng)講解了“遠(yuǎn)程

35、視圖”,您也許已經(jīng)發(fā)現(xiàn)了遠(yuǎn)程視圖的不足,是的遠(yuǎn)程視圖的缺陷正是SPT的優(yōu)勢所在:執(zhí)行除Select以外的其他的SQL語句,如Insert 及Update等 執(zhí)行后端數(shù)據(jù)庫的存儲過程 執(zhí)行后端數(shù)據(jù)庫的特殊的函數(shù)、命令 一次得到多個數(shù)據(jù)集合這些都是我們在系統(tǒng)開發(fā)時要遇到的實(shí)現(xiàn)問題,Visual FoxPro 小組注意到了,于是提出了SPT的概念。SPT是SQL Pass Through的簡寫,它與遠(yuǎn)程視圖在一起共同組成Visual FoxPro遠(yuǎn)程數(shù)據(jù)訪問體系,利用它們你就可以開發(fā)完整的ClientServer構(gòu)架的系統(tǒng)了!與“遠(yuǎn)程視圖”相比,SPT技術(shù)也有以下缺陷:沒有圖形用戶界面 必須人工維護(hù)

36、連接 數(shù)據(jù)集合是“可讀寫光標(biāo)”,要使它成為“可更新光標(biāo)”必須進(jìn)行設(shè)定 從我的經(jīng)驗(yàn)來看待“遠(yuǎn)程視圖”與SPT,我以為兩者是Visual FoxPro遠(yuǎn)程數(shù)據(jù)訪問體系的雙臂,相輔相成。不用SPT,系統(tǒng)就會變得弱智、愚笨;不用遠(yuǎn)程視圖,系統(tǒng)開發(fā)會變得緩慢、繁瑣。我以為,“遠(yuǎn)程視圖”是組件化的SPT,是微軟公司對SPT部分功能的圖像化封裝,所以它顯得更有生產(chǎn)效率,同時由于系統(tǒng)作得多了,功能也就弱了,“遠(yuǎn)程視圖”能做得就是那些事情從數(shù)據(jù)源讀取一個結(jié)果集,在客戶端對它維護(hù),并自動將變動結(jié)果更新到數(shù)據(jù)源。然而作為系統(tǒng)開發(fā),我們會在實(shí)踐中遇到林林總總、奇奇怪怪的需求,只有“遠(yuǎn)程視圖”獨(dú)立擔(dān)當(dāng)顯然是不行的,所以

37、SPT的出現(xiàn)有它的必然性。在其他的遠(yuǎn)程數(shù)據(jù)處理組件中也有類似的概念,例如ADO中的RecordSet相當(dāng)于Visual FoxPro的遠(yuǎn)程視圖,Command相當(dāng)于Visual FoxPro的SPT。13個SPT函數(shù)Visual FoxPro 中內(nèi)置了13個以SQL開頭的函數(shù),我們把它們稱為SPT函數(shù)。就是這13個函數(shù)完成了Visual FoxPro的所有的SQL Pass Though功能。從功能上看,我們可以把它們分成五個部分:連接函數(shù)連接建立函數(shù):SqlConnect(),SqlStringConnect()連接的斷開函數(shù):SqlDisconnect()核心的執(zhí)行函數(shù)SQL語句傳輸及執(zhí)行

38、函數(shù):SqlExec(),SqlPrapare()批次模式下更多數(shù)據(jù)集的取得函數(shù):SqlMoreResults()異步模式下撤銷正在執(zhí)行的SPT的函數(shù):SqlCancel()事務(wù)處理函數(shù)SqlCommit(),SqlRollBack()連接通道屬性函數(shù)SqlGetProp(),SqlSetProp()數(shù)據(jù)源的信息截取函數(shù)SqlTables(),SqlColumns()連接到SQL Server連接SqlConnect()的兩種用法一般來說SqlConnect有兩種用法:直接調(diào)用操作系統(tǒng)里的用戶型或系統(tǒng)型DNS;使用當(dāng)前數(shù)據(jù)庫DBC的連接對象。如果已經(jīng)在操作系統(tǒng)中制作了一個名為LocalServ

39、er的系統(tǒng)型DNS,在命令窗口中我們就可以直接鍵入:SQLCONNECT("localserver","sa","")如果當(dāng)前數(shù)據(jù)庫中存在連接對象,我們就可以這樣調(diào)用它:SQLCONNECT("NorthWind")SqlStringConnect()函數(shù)的用法在用了SqlConnect以后,大家也許會發(fā)現(xiàn)不太自由,能不能及時動態(tài)建立連接呢?可以的,用SqlStringConnect()就可以了:SQLSTRINGCONNECT("driver=SQL Server;Server=See-you;Uid=

40、sa;pwd=;database=northwind")我們解釋一下參數(shù)字符串的意義,driver指明了使用哪一個ODBC驅(qū)動程序,這里是SQL Server;Server是指SQL Server的服務(wù)器名稱,我的服務(wù)器叫:See-You;UID是在SQL Server的用戶名稱,這里使用SA;PWD是用戶口令,這里為空值;最后我們指定了要連接的數(shù)據(jù)庫的名字,這次我們?nèi)匀皇褂肗orthWind數(shù)據(jù)庫。所有這些條件組成了一個字符串,各條件用分號分割,我的實(shí)驗(yàn)表明對這大小寫的要求不高,當(dāng)然不包括用戶口令和用戶名。關(guān)于連接的兩大問題連接建立起來很簡單,但尚有問題要解決:怎么判斷連接是否成功

41、?怎么屏蔽SQL Server的登陸對話框?第一個問題很好解決,只要SqlConnect()或是SqlStringConnect()返回正整數(shù)(>0的數(shù))就表示連接成功,得到的正整數(shù)很重要就是連接句柄!STORE SQLCONNECT('LocalServer', 'sa','錯誤密碼') TO gnConnHandleIF gnConnHandle <= 0= MESSAGEBOX('連接錯誤', 16, '連接到SQL Server')ELSE= MESSAGEBOX('連接成功',

42、 48, '連接到SQL Server')ENDIF在有些時候,連接發(fā)生錯誤會彈出以下兩個提示框(有時出現(xiàn)前一個、有時出現(xiàn)后一個,有時連續(xù)出現(xiàn)):連接錯誤提示SQL Server的登錄提示這是一個讓人迷惑的的問題,我以為:第一個“連接錯誤提示”是限于Visual FoxPro或ODBC的層次,也就是說與SQL Server無關(guān),這種錯誤的出現(xiàn)往往是找不到SQL Server服務(wù)器之類的問題,如以下的語句:SQLSTRINGCONNECT("driver=SQL Server;Server=See-y1ou;Uid=sa;pwd=;database=northwind&

43、quot;)這是為了讓用戶更正連接信息的,但是在實(shí)際開發(fā)中沒有哪個程序員希望此對話框暴露在用戶面前。如果我們使用的連接是DBC的連接對象,問題就比較好解決,因?yàn)樵诮⑦B接時我們可以設(shè)定連接對話框的出現(xiàn)規(guī)律:同樣的我們可以通過命令來控制“顯示 ODBC 登錄提示”:DBSETPROP("connect1","CONNECTION" ,"DISPLOGIN" ,1) &&發(fā)生連接錯誤時彈出DBSETPROP("connect1","CONNECTION" ,"DISPLOG

44、IN" ,2) &&任何時候總是誤時彈出DBSETPROP("connect1","CONNECTION" ,"DISPLOGIN" ,3) &&發(fā)任何時候都不彈出但是當(dāng)我們使用連接字符串、直接使用操作系統(tǒng)的DNS時,它們都不是Visual FoxPro的DBC中的連接對象,就不能用以上的方法控制,我們可以設(shè)定Visual FoxPro的環(huán)境:SQLSETPROP(0,"DispLogin" ,3)注意我對第一個參數(shù)賦值為0,表明設(shè)定的是對Visual FoxPro的系統(tǒng)環(huán)

45、境進(jìn)行設(shè)定。值得注意的是,系統(tǒng)環(huán)境設(shè)定只是與這種即時產(chǎn)生連接有效,對存放在DBC中的連接對象并不起作用,根據(jù)連接對象建立的連接的有關(guān)屬性還是要通過DBSETPROP()來設(shè)定。斷開連接建立的連接就應(yīng)該再不用時及時斷開,斷開連接請使用SqlDisConnect()函數(shù)。Local hConnhconn=SQLCONNECT("NorthWind")?SQLDISCONNECT(hconn)/返回1表示連接斷開成功這里有三個問題提請大家注意。第一,如果hconn是一個有效的連接句柄,對它執(zhí)行SqlDisConn()函數(shù)會有這樣的結(jié)果,成功返回1,其他表示斷開操作失??;第二:如果

46、hconn不是一個有效的連接句柄,Visual FoxPro將觸發(fā)一個錯誤,錯誤代號為1466,怎樣判斷某個連接句柄是不是有效的方法,我們在后文介紹;第三,如果想一下子斷開所有的連接,您可以使用這樣的方法:SQLDISCONNECT(0)從后端得到數(shù)據(jù)集得到一個數(shù)據(jù)集SQLEXEC(nConnectionHandle, cSQLCommand, cCursorName)先來解釋一下SQLEXEC()函數(shù):參數(shù)nConnectionHandle表示連接句柄;參數(shù)cSQLCommand表示要傳送的語句,注意此語句一定是數(shù)據(jù)源認(rèn)得的語句,而不是Visual FoxPro的語句。這一點(diǎn)從SQL Pas

47、s Though這個名字上就能看得出了,顧名思義:Visual FoxPro只不過是是將別人的語言傳送給別人,這一點(diǎn)在SQLEXEC()函數(shù)體現(xiàn)的特別突出;參數(shù)cCursorName表示得到的結(jié)果集的名字,如果省略,返回的結(jié)果集將以Sqlresult命名。如果返回1表示,執(zhí)行成功;如果返回0表示正在執(zhí)行;如果返回負(fù)數(shù)表示執(zhí)行失敗。如果我們希望得到NorthWind數(shù)據(jù)庫中的Employees表的數(shù)據(jù),就可以執(zhí)行以下命令:SQLEXEC(hconn,"SELECT * FROM EMPLOYEES","MyCursor")Browse判斷連接有效性這是一個

48、非常實(shí)際的問題,我們建立了一條連接以后,怎樣知道Visual FoxPro與SQL Server的通信是正常的,機(jī)連接是確實(shí)有效的,只有一種方法應(yīng)用這條連接,可以這樣:?SQLEXEC(hconn,"")&&一個空的命令發(fā)送,返回1的話證明連接可用!大型語句的傳遞技巧如果想得到一個更為復(fù)雜的結(jié)果集合,我們可以傳送依據(jù)大型的SQL-Select描述。這里有一些經(jīng)驗(yàn)送給大家:如果傳送的語句太大(大約是超過256個字符,其實(shí)沒有必要去計(jì)數(shù)只要你覺得語句很大時就應(yīng)該考慮我的建議,不然您就沒有辦法傳送大型的語句),您直接把要傳送的語句放入SQLEXEC()中,Visu

49、al FoxPro就會報(bào)錯,說無法認(rèn)得此語句,于是大家就又多了誹謗Visual FoxPro的一條把柄!(根據(jù)我的研究,在Delphi中也有此問題)解決之道是:把長長的語句先放在一個變量中,再將此變量作為參數(shù)賦給SQLEXEC()函數(shù)。 關(guān)于分隔符的使用技巧,Visual FoxPro中分隔字符串使用三種符號:雙引號、單引號、方括號。在配置要傳送的語句時一定要用雙引號作為字符串的分隔符,其他的兩個符號應(yīng)另作他用。以上的建議絕對經(jīng)典,以下我們就用實(shí)例來說明:在SQL Server中要得到詳細(xì)銷售情況的SQLSelect語句如下(詳細(xì)的知識見本人撰寫的SELECT-SQL 周周談一文):SELEC

50、T ORDERS.SHIPNAME,ORDERS.SHIPADDRESS,ORDERS.SHIPCITY,ORDERS.SHIPREGION,ORDERS.SHIPPOSTALCODE,ORDERS.SHIPCOUNTRY,ORDERS.CUSTOMERID,CUSTOMERS.COMPANYNAME AS CUSTOMERNAM,EMPLOYEES.FIRSTNAME+' '+EMPLOYEES.LASTNAME AS SALESPERSON,ORDERS.ORDERID,ORDERS.ORDERDATE,ORDERS.REQUIREDDATE,ORDERS.SHIPPEDD

51、ATE,SHIPPERS.COMPANYNAME AS SHIPPERNAME,ORDER DETAILS.PRODUCTID,PRODUCTS.PRODUCTNAME,ORDER DETAILS.UNITPRICE,ORDER DETAILS.QUANTITY,ORDER DETAILS.DISCOUNT,ORDER DETAILS.UNITPRICE*ORDER DETAILS.QUANTITY*(1-ORDER DETAILS.DISCOUNT) AS EXTENDEDPRICE, ORDERS.FREIGHTFROM (EMPLOYEES INNER JOIN ORDERS ON EM

52、PLOYEES.EMPLOYEEID=ORDERS.EMPLOYEEID) INNER JOIN CUSTOMERS ON ORDERS.CUSTOMERID=CUSTOMERS.CUSTOMERID)INNER JOIN SHIPPERS ON ORDERS.SHIPVIA=SHIPPERS.SHIPPERID)INNER JOIN ORDER DETAILS ON ORDERS.ORDERID=ORDER DETAILS.ORDERID)INNER JOIN PRODUCTS ON ORDER DETAILS.PRODUCTID=PRODUCTS.PRODUCTID這是一句12行,不計(jì)空格

53、864個字符的大型語句,現(xiàn)在要通過Visual FoxPro的SQLEXEC()函數(shù)傳送:local csq&&配置待傳送的語句csql=csql+"SELECT ORDERS.SHIPNAME,ORDERS.SHIPADDRESS,ORDERS.SHIPCITY,ORDERS.SHIPREGION,"csql=csql+"ORDERS.SHIPPOSTALCODE,ORDERS.SHIPCOUNTRY,ORDERS.CUSTOMERID,"csql=csql+"CUSTOMERS.COMPANYNAME AS CUSTOMER

54、NAM,"csql=csql+"EMPLOYEES.FIRSTNAME+' '+EMPLOYEES.LASTNAME AS SALESPERSON,ORDERS.ORDERID,ORDERS.ORDERDATE,"csql=csql+"ORDERS.REQUIREDDATE,ORDERS.SHIPPEDDATE,SHIPPERS.COMPANYNAME AS SHIPPERNAME,"csql=csql+"ORDER DETAILS.PRODUCTID,PRODUCTS.PRODUCTNAME,ORDER DETAIL

55、S.UNITPRICE,"csql=csql+"ORDER DETAILS.QUANTITY,ORDER DETAILS.DISCOUNT,"csql=csql+"ORDER DETAILS.UNITPRICE*ORDER DETAILS.QUANTITY*(1-ORDER DETAILS.DISCOUNT) AS EXTENDEDPRICE,"csql=csql+"ORDERS.FREIGHT"csql=csql+" FROM (EMPLOYEES INNER JOIN ORDERS ON EMPLOYEES.E

56、MPLOYEEID=ORDERS.EMPLOYEEID)"csql=csql+" INNER JOIN CUSTOMERS ON ORDERS.CUSTOMERID=CUSTOMERS.CUSTOMERID)"csql=csql+" INNER JOIN SHIPPERS ON ORDERS.SHIPVIA=SHIPPERS.SHIPPERID)"csql=csql+" INNER JOIN ORDER DETAILS ON ORDERS.ORDERID=ORDER DETAILS.ORDERID)"csql=csql+&q

57、uot; INNER JOIN PRODUCTS ON ORDER DETAILS.PRODUCTID=PRODUCTS.PRODUCTID"&&傳送,得到的光標(biāo)名稱為默認(rèn)的SqlResultSQLEXEC(hconn,csql)解釋:由于語句很長,我花費(fèi)了多條賦值語句才完成配置這個字符串。大家注意到了我選用雙引號作為字符串分隔符,這里面是有大學(xué)問的。在SQL Server中有待空格的表名如:Order Details,當(dāng)它用于SQL語句時,就必須要用方括號標(biāo)示,所以如果在Visual FoxPro中如果用方括號分割字符串的話,就會有沖突!;單引號是SQL Serve

58、r中分隔字符串、日期值的符號,在Visual FoxPro中如果使用單引號分隔字符串的話,也會造成沖突,當(dāng)然在以上語句中我們沒有看到單引號的身影,不過我們做一個變動,大家就會感到問題的存在了!local csq&&配置待傳送的語句csql=csql+"SELECT ORDERS.SHIPNAME,ORDERS.SHIPADDRESS,ORDERS.SHIPCITY,ORDERS.SHIPREGION,"csql=csql+"ORDERS.SHIPPOSTALCODE,ORDERS.SHIPCOUNTRY,ORDERS.CUSTOMERID,&quo

59、t;csql=csql+"CUSTOMERS.COMPANYNAME AS CUSTOMERNAM,"csql=csql+"EMPLOYEES.FIRSTNAME+' '+EMPLOYEES.LASTNAME AS SALESPERSON,ORDERS.ORDERID,ORDERS.ORDERDATE,"csql=csql+"ORDERS.REQUIREDDATE,ORDERS.SHIPPEDDATE,SHIPPERS.COMPANYNAME AS SHIPPERNAME,"csql=csql+"ORDER

60、DETAILS.PRODUCTID,PRODUCTS.PRODUCTNAME,ORDER DETAILS.UNITPRICE,"csql=csql+"ORDER DETAILS.QUANTITY,ORDER DETAILS.DISCOUNT,"csql=csql+"ORDER DETAILS.UNITPRICE*ORDER DETAILS.QUANTITY*(1-ORDER DETAILS.DISCOUNT) AS EXTENDEDPRICE,"csql=csql+" ORDERS.FREIGHT"csql=csql+&qu

61、ot; FROM (EMPLOYEES INNER JOIN ORDERS ON EMPLOYEES.EMPLOYEEID=ORDERS.EMPLOYEEID)"csql=csql+" INNER JOIN CUSTOMERS ON ORDERS.CUSTOMERID=CUSTOMERS.CUSTOMERID)"csql=csql+" INNER JOIN SHIPPERS ON ORDERS.SHIPVIA=SHIPPERS.SHIPPERID)"csql=csql+" INNER JOIN ORDER DETAILS ON ORD

62、ERS.ORDERID=ORDER DETAILS.ORDERID)"csql=csql+" INNER JOIN PRODUCTS ON ORDER DETAILS.PRODUCTID=PRODUCTS.PRODUCTID"csql=csql+" WHERE ORDERS.ORDERDATE BETWEEN '1996-10-01' AND '1997-09-30'"csql=csql+" AND ORDERS.CUSTOMERID LIKE '%C%'"csql=csql+

63、" AND ORDER DETAILS.QUANTITY>50"&&傳送,得到的光標(biāo)名稱為默認(rèn)的SqlResultSQLEXEC(hconn,csql)傳遞變量上面一個例子充分證明了我關(guān)于字符串分隔符的經(jīng)驗(yàn),接著我又為大家提出了一個新課題:怎樣傳遞變量到SQL Server中。上例中,我們?yōu)檎Z句加入了Where字句,下面我們把其中的條件值變?yōu)樽兞?,這樣這句SQL傳遞才變得真正的有意義!我以為關(guān)于變量的傳遞有兩種方法,下面逐一介紹。第一種是利用:問號+變量來傳遞的,這是一種常用的方法,用起來也很簡單,不用擔(dān)心變量的類型,ODBC會自動的轉(zhuǎn)化。下面的例子中就涉及到了日期型、數(shù)值型、字符型變量,我們根本不用擔(dān)心變量類型的轉(zhuǎn)化,只要在前面加上問號填入語句中就行了:local csq&&要傳送的變量dDate1=1996-10-01dDate2=1997-09-30cCustomerID="%C%"nQty=50&&配置待傳送的語句csql=csql+"SELEC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論