第七章TUXEDO的客戶端編程-融金教育_第1頁
第七章TUXEDO的客戶端編程-融金教育_第2頁
第七章TUXEDO的客戶端編程-融金教育_第3頁
第七章TUXEDO的客戶端編程-融金教育_第4頁
第七章TUXEDO的客戶端編程-融金教育_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第七章:TUXEDO的客戶端編程7.1 Tuxedo的客戶端簡介:tuxedo有兩種客戶端: 本地客戶端和遠(yuǎn)程客戶端。NATIVE CLIENT(本地客戶端): 是指與TUXEDO服務(wù)器在同一臺(tái)機(jī)器上,不用通過網(wǎng)絡(luò)就可以訪問到TUXEDO服務(wù)器的客戶端 。WORSTATION CLIENT(本地客戶端):是指要通過網(wǎng)絡(luò)才可以訪問到TUXEDO服務(wù)器的客戶端。下圖為TUXEDO應(yīng)用系統(tǒng)的客戶端訪問TUXEDO服務(wù)器上的服務(wù)的過程圖。說明:WS(Workstation Extension Product) 用于指TUXEDO產(chǎn)品的客戶端部分WSC Workstation ClientWSL(Wor

2、kstation Listener)TUXEDO系統(tǒng)自帶的一個(gè)SERVER,它偵聽一個(gè)指定的端口,WSC最初與該SERVER建立連接WSH(Workstation Handler)TUXEDO系統(tǒng)自帶的一個(gè)SERVER,由它處理WSC與TUXEDO SERVER之間的通訊。Bulletin Board(公告板)TUXEDO把系統(tǒng)的配置保存在一個(gè)共享內(nèi)存中,該共享內(nèi)存稱為公告板(BB)BBLTUXEDO的管理進(jìn)程,主要對公告板等進(jìn)行管理Workstation Client與TUXEDO SERVER建立連接的過程為:1 WSC 調(diào)用tpinit()或tpchkauth()2 WSC采用在WSNA

3、DDR中指定的IP地址與服務(wù)端的WSL建立連接3 WSL為該WSC指定一個(gè)WSH,并把該WSH的偵聽端口返回給WSC4 WSC采用返回的端口與指定的WSH建立連接,并與WSL斷開連接,這之后WSC與TUXEDO SERVER之間的通訊通過WSH進(jìn)行處理,與WSL無關(guān)。5 tpinit()或tpchkauth()調(diào)用返回。本地客戶端與遠(yuǎn)程客戶端的主要區(qū)別1. 本地客戶端只能用C語言或COBAL語言編寫,遠(yuǎn)程客戶端可以用幾乎所有的編程語言編寫。2. 在遠(yuǎn)程客戶端所在的機(jī)器上要安裝TUXEDO的客戶端軟件,并且在設(shè)置相應(yīng)的環(huán)境變量;在本地客戶端上不用3. 用buildclient編譯遠(yuǎn)程客戶端程序時(shí)

4、要加 W,編譯本地客戶端則不用與遠(yuǎn)程客戶端有關(guān)的配置:1 在MACHINES中要配置MAXWSCLIENTS,即最多可以有多少個(gè)遠(yuǎn)程客戶端同時(shí)連接到該服務(wù)器上。2 在SERVERS中要配置SERVER:WSLWSL SRVGRP="GROUP1" SRVID=1116 CLOPT="-A - -n /13:8888 -m 2 -M 5 -x 6"CLOPT中可帶的參數(shù)為:CLOPT=" -A servopts_options - -n netaddr -d device -w WSHname-t timeout_fac

5、tor-T Client_timeout -m minh-M maxh-x mpx_factor -p minwshport-P maxwshport -I init_timeout-c compression_threshold -k compression_threshold -z bits-Z bits-H external_netaddr -N network_timeout-Kclient|handler|both|none"參數(shù)說明:-n netaddr: WSL的偵聽端口,遠(yuǎn)程客戶端通過該端口與服務(wù)器建立連接-m minh : 最少啟動(dòng)多少個(gè)WSH進(jìn)程-M maxh:

6、最多啟動(dòng)多少個(gè)WSH進(jìn)程,默認(rèn)值為MAXWSCLIENTS/m-x mpx_factor:每個(gè)WSH進(jìn)程可以同時(shí)與多少個(gè)遠(yuǎn)程客戶端建立連接-c compression_threshold如果在遠(yuǎn)程客戶端與服務(wù)器之間傳送的數(shù)據(jù)包大小(單位為字節(jié))超過-c指定的參數(shù),就自動(dòng)進(jìn)行數(shù)據(jù)壓縮,-T Client_timeout: 指定一個(gè)遠(yuǎn)程客戶端的空閑時(shí)間,如果該遠(yuǎn)程客戶端在client_timeout這么長的時(shí)間內(nèi)沒有做任何調(diào)用,WSH將斷開與該遠(yuǎn)程客戶端的連接。單位為分鐘,如果沒有指點(diǎn)該參數(shù),那么WSH永遠(yuǎn)不會(huì)自動(dòng)斷開遠(yuǎn)程客戶端的連接-t timeout_factor: 指定遠(yuǎn)程客戶端與WSH建立

7、連接的時(shí)間,如果在-t指定的時(shí)間內(nèi)還沒有建立連接,那么連接將失敗。如果沒有采用安全認(rèn)證方式默認(rèn)為3*SCANUNIT秒,。如果采用安全認(rèn)證方式默認(rèn)為6*SCANUNIT秒, -p minwshport-P maxwshport:指定WSH可以使用的端口范圍:如果遠(yuǎn)程客戶端要跨越防火墻才能訪問該TUXEDO應(yīng)用系統(tǒng),在WSL中要指定該參數(shù),指定WSH可以使用的端口范圍,并讓防火墻允許訪問這些端口。如果不指定,TUXEDO會(huì)根據(jù)系統(tǒng)端口的使用情況進(jìn)行分配,而分配的端口防火墻不允許通過,造成CLIENT無法調(diào)用TUXEDO SERVER。如下面的設(shè)置指定WSH可用的端口范圍為17010 17030。

8、WSLSRVGRP=GROUP1SRVID=1CLOPT="-A - -n /6:17009 -m 10 -M 10 -x 10 -p 17010 -P 17030"在遠(yuǎn)程客戶端的機(jī)器上要設(shè)置的環(huán)境變量TUXDIR (必需):TUXEDO客戶端在該機(jī)器上的安裝目錄WSNADDR(必需):遠(yuǎn)程客戶端通過該IP地址與服務(wù)器建立連接,它的值為-n參數(shù)的值,如在上面的配置中為:SET WSNADDR= /13:8888WSTYPE(可選): 該客戶端的類型,如果與服務(wù)器的類型一樣,那么在它們之間進(jìn)行數(shù)據(jù)傳送時(shí)不用進(jìn)行編碼解碼工作。其他

9、不常用的環(huán)境變量可參考TUXEDO的聯(lián)機(jī)文檔??蛻舳说木幊棠J剑涸?層結(jié)構(gòu)中,CLIENT是屬與表示層,表示層主要處理與用戶交互,它的功能可概括為:1、提供應(yīng)用的用戶交互接口,即主要通過圖形化的用戶界面,取的用戶的輸入數(shù)據(jù)2、與TUXEDO 應(yīng)用服務(wù)器建立連接3、調(diào)用TUXEDO應(yīng)用服務(wù)器上的服務(wù)(SERVICE),把客戶端的輸入?yún)?shù)放入輸出緩沖區(qū)。4、TUXEDO應(yīng)用服務(wù)器調(diào)用相應(yīng)的SERVICE處理客戶端的請求,把處理結(jié)果通過客戶端的輸入緩沖區(qū)返回給客戶端。 客戶端與服務(wù)端之間的通訊方式有以下幾種:1、同步調(diào)用:2、異步調(diào)用3、會(huì)話方式:4、可靠消息隊(duì)列5、廣播方式6、發(fā)布/訂閱在下一章我

10、們再具體介紹7.2 CLIENT的ATMI介紹客戶端通過調(diào)用TUXEDO提供的編程API(ATMI)來編寫程序,下面介紹一些客戶端主要的ATMI與連接的建立與斷開有關(guān)的ATMI為了與TUXEDO SERVER建立連接,TUXEDO CLIENT要調(diào)用TPCHKAUTH()檢查該TUXEDO SERVER所采用的安全方式,并根據(jù)得到的值做相應(yīng)的處理,然后調(diào)用TPINIT()建立與TUXEDO的連接,在TUXEOD SERVER的結(jié)果返回之后,調(diào)用TPTERM()斷開與TUXEDO SERVER的連接.int tpchkauth()描述: 檢查該TUXEDO SERVER所采用的安全方式參數(shù):無返

11、回值: TPNOAUTH:不需要認(rèn)證 TPSYSAUTH:需要口令認(rèn)證 TPAPPSUTH:需要口令認(rèn)證,并且還需要應(yīng)用級(jí)的認(rèn)證或授權(quán). -1:調(diào)用失敗, 錯(cuò)誤號(hào)保存在全局變量tperrno中。int tpinit(TPINIT *tpinfo)描述: 與TUXEDO SERVER建立連接參數(shù):TPINFO返回值: 失敗返回-1, 錯(cuò)誤號(hào)保存在全局變量tperrno中。TPINIT結(jié)構(gòu)體在atmi.h中的定義如下structtpinfo_t char usrnameMAXTIDENT+2;/* client user name */char cltnameMAXTIDENT+2;/* appl

12、ication client name */char passwdMAXTIDENT+2;/* application password */char grpnameMAXTIDENT+2;/* client group name */long flags;/* initialization flags */long datalen;/* length of app specific data */long data;/* placeholder for app data */;typedefstructtpinfo_t TPINIT;說明:username,cltname,passwd,gr

13、pname,data,datalen用于安全認(rèn)證中flags:用于定義以何種方式通知該客戶端一個(gè)UNSOLICTED MESSAGE的到來.它的值可以為:TPU-SIGTPU-DIPTPU-IGNTPSA-FASTPATHTPSA-PROTECTEDint tpterm()描述: 斷開與TUXEDO SERVER建立連接參數(shù):無返回值: 失敗返回-1, 錯(cuò)誤號(hào)保存在全局變量tperrno中。與請求TUXEDO SERVER 有關(guān)的ATMIint tpcall(char *svc, char *idata, long ilen, char *odata, long *olen, long fla

14、gs)描述:客戶端同步調(diào)用服務(wù)端的名為svc的SERVICE,參數(shù): *svc:SERVICE的名稱char *idata: 輸入緩沖區(qū)的地址,客戶端傳給服務(wù)端的參數(shù)放在該緩沖區(qū)內(nèi)long ilen: 輸入緩沖區(qū)的長度char *odata 輸出緩沖區(qū)的地址,服務(wù)端傳給客戶端的結(jié)果放在該緩沖區(qū)內(nèi)long *olen:輸出緩沖區(qū)的長度 long flags: 調(diào)用標(biāo)志,由以下幾個(gè):TPNOTRAN如果調(diào)用svc的客戶端當(dāng)前在TRANSACTION方式下,那么svc不參與當(dāng)前的TRANSACTION。TPNOCHANGE如果服務(wù)端返回的緩沖區(qū)類型與客戶端定義的緩沖區(qū)(odata)類型不一致,默認(rèn)情

15、況下,odata會(huì)轉(zhuǎn)換成與服務(wù)端返回的緩沖區(qū)類型一致的類型,如果設(shè)置了該FLAG,那么當(dāng)出現(xiàn)這種情況時(shí),不進(jìn)行緩沖區(qū)類型轉(zhuǎn)換,并且會(huì)保錯(cuò)。TPNOBLOCK默認(rèn)情況下,如果客戶端有阻塞條件存在(如CLIENT的TCP/IP中的緩沖區(qū)滿,磁盤I/O忙等),那么客戶端會(huì)阻塞在那里,直到阻塞消除或超時(shí)出錯(cuò)。如果設(shè)置了TPNOBLOCK,當(dāng)客戶端有阻塞條件存在時(shí),TPCALL()會(huì)立刻返回并報(bào)錯(cuò). 注意TPNOBLOCK只對發(fā)送請求時(shí)起作用,如果在接收服務(wù)端返回的結(jié)果時(shí)有阻塞條件存在,客戶端會(huì)在那里等待,直到阻塞消除或超時(shí)出錯(cuò)TPNOTIME如果客戶端有阻塞條件存在,客戶端會(huì)一直阻塞在那里,即使到了超

16、時(shí)時(shí)間也不返回,但如果該客戶端是在TRANSACTION模式下,當(dāng)?shù)搅耸聞?wù)的超時(shí)時(shí)間,還是會(huì)報(bào)超時(shí)錯(cuò)誤并返回。TPSIGRSTRT如果在進(jìn)行系統(tǒng)調(diào)用時(shí),被信號(hào)中斷,該系統(tǒng)調(diào)用會(huì)重新進(jìn)行。調(diào)用成功返回0,失敗返回-1, 錯(cuò)誤號(hào)保存在全局變量tperrno中。int tpacall(char *svc, char *data, long len, long flags)描述: 客戶端異步調(diào)用服務(wù)端的名為svc的SERVICE,不等服務(wù)端返回結(jié)果,程序可繼續(xù)往下走,在某個(gè)地方調(diào)用tpgetrply()取的服務(wù)端的返回參數(shù):char *svc, char *data, long len參數(shù)的含義與tp

17、call()中的一樣flags 可設(shè)置為:TPNOTRAN, TPNOREPLY, TPNOBLOCKTPNOTIME, TPSIGRSTRT.TPNOTRAN, TPNOBLOCKTPNOTIME, TPSIGRSTRT的含義與與tpcall()中的一樣TPNOREPLY:調(diào)用tpacall()的客戶端不想接收SEVER端的應(yīng)答。如果設(shè)置了TPNOREPLY:服務(wù)端不會(huì)給該客戶端發(fā)送應(yīng)答。返回值: 失敗返回-1,成功返回一個(gè)HANDLER,可作為tpgetrply的參數(shù),用于取應(yīng)答int tpgetrply(int *cd, char *data, long *len, long flags

18、)描述:取出服務(wù)端對tpacall()的應(yīng)答。參數(shù): cd tpacall()返回的HANDLERchar *data返回緩沖區(qū)的地址,服務(wù)端傳給客戶端的結(jié)果放在該緩沖區(qū)內(nèi)long *len:返回緩沖區(qū)的長度flags:可以是:TPNOBLOCK, TPNOTIME,TPSIGRSTRT,TPGETANY(不管cd的值,從服務(wù)器的應(yīng)答隊(duì)列中取第一個(gè)可用的消息),TPNOCHANGE 返回值: 失敗返回-1,錯(cuò)誤號(hào)保存在全局變量tperrno中。int tpcancel(int handle)描述: 如果當(dāng)前的程序不處于事務(wù)模式中,取消對tpacall()的應(yīng)答, 如果處于事務(wù)模式中,則不能取消

19、對tpacall()的應(yīng)答,該調(diào)用會(huì)失敗.參數(shù): tpacall()返回的HANDLER返回值: 失敗返回-1,錯(cuò)誤號(hào)保存在全局變量tperrno中。int tpgprio()描述:返回最近發(fā)送(tpcall(),tpacall()或接收(tpgetrply()的一個(gè)消息的優(yōu)先級(jí)參數(shù):無返回值: 1-100消息的優(yōu)先級(jí),值越高, 優(yōu)先級(jí)越高 失敗返回-1, 錯(cuò)誤號(hào)保存在全局變量tperrno中。struct int hdl; /* handle*/int pr; /* priority*/ paSIZE;for (i=0; i<requests; i+) /* Determine ser

20、vice and data for request */pa i.hdl = tpacall(Svc, buf, len, flags);/* Save priority used to send request */pai.pr = tpgprio();/* Use qsort(3) routine to sort handles in priority order */qsort(char*) pa, requests, sizeof(pa0), cmpfcn);for (i=0; i< requests; i+) tpgetrply(&pai.hdl, &rbufp

21、, &rlen, rflags);int tpsprio (int prio, long flags)描述: 設(shè)置下一個(gè)要發(fā)送的消息的優(yōu)先級(jí)參數(shù): 0- prio為相對值, 設(shè)置下一個(gè)要發(fā)送的消息的優(yōu)先級(jí)為現(xiàn)在的優(yōu)先級(jí)加上prio TPABSOLUTE: prio為絕對值, 設(shè)置下一個(gè)要發(fā)送的消息的優(yōu)先級(jí)為prio返回值: 失敗返回-1,錯(cuò)誤號(hào)保存在全局變量tperrno中。與請求錯(cuò)誤處理有關(guān)的ATMIchar *tpstrerror(int tperrno) 描述:返回錯(cuò)誤號(hào)為tperrno的錯(cuò)誤描述參數(shù): tperrno:在atmi.h中定義的全局變量,用于標(biāo)識(shí)錯(cuò)誤號(hào),類似于C中的

22、errno返回值: 失敗返回NULL,成功返回錯(cuò)誤號(hào)為tperrno的錯(cuò)誤描述.int tperrordetail(long flags)描述: 返回當(dāng)前進(jìn)程或線程最近調(diào)用ATMI的出錯(cuò)的更詳細(xì)的描述參數(shù):設(shè)為0返回值: 如果沒有錯(cuò)誤返回0,有錯(cuò)誤返回錯(cuò)誤描述號(hào)char * tpstrerrordetail(int err, long flags)描述: 返回錯(cuò)誤描述號(hào)err的詳細(xì)描述信息參數(shù): err : tperrordetail()的返回值, flags: 設(shè)為0返回值: 失敗返回NULL,成功返回詳細(xì)描述信息7.3 采用C語言編寫TUXEDO的客戶端程序如果是采用C語言編寫TUXEDO

23、的客戶端程序,可直接采用ATMI的函數(shù),這些函數(shù)在atmi.h中定義.采用C語言編寫TUXEDO的客戶端的例子在此不列舉,可參考simpapp,bankapp等例子.采用C語言編寫客戶端的編譯是用buildclient命令進(jìn)行的,它的使用格式如下:buildclient -C -v -w | -r rmname -o outfile -f firstfiles -l lastfiles參數(shù)說明:-C: 編譯用COBOL寫的客戶端 -v: 輸出詳細(xì)的編譯信息-w: 編譯成REMOTE CLIENT,如果不帶該參數(shù),那么將編譯成NATIVE CLIENT.-o: 編譯生成的可執(zhí)行文件名-f: 要編

24、譯的C文件名-l: 指定要編譯生成該可執(zhí)行文件名要連接的其他庫文件,如果有多個(gè)庫文件要連接,它們之間用空格隔開.-r: 指定該CLIENT要連接的RMbuildclient 調(diào)用C或C+編譯器來進(jìn)行編譯工作.所以客戶端所在的機(jī)器要有C,C+編譯器才能編譯C客戶端的程序.如果是WINDOWS客戶端,可安裝VC,并在DOS環(huán)境下編譯C客戶端的程序. 如果在安裝VC時(shí)沒有把自動(dòng)設(shè)置環(huán)境變量的選項(xiàng)選上,VC中設(shè)置環(huán)境變量的文件在VC安裝目錄下的binvcvars32.bat中,可手工執(zhí)行它或在設(shè)置環(huán)境變量的文件中用CALL調(diào)用它,如:call d:vs6vc98binvcvars32.batset T

25、UXDIR=d:tuxedo65set WSNADDR=/4:9000set APPDIR=d:tuxdemoconnset PATH=%TUXDIR%bin;%APPDIR%;%PATH%set TUXCONFIG=%APPDIR%tuxconfigset FIELDTBLS=%APPDIR%myfmlset FLDTBLDIR=%APPDIR%如果是UNIX客戶端,可安裝CC,GCC等C或C+編譯器.并在CC環(huán)境變量中設(shè)置所用的C編譯器路徑.7.4 采用VC編寫TUXEDO客戶端程序采用VC編寫客戶端程序與采用C語言編寫客戶端的方式一樣,但要對VC要進(jìn)行一些設(shè)置才能進(jìn)

26、行編譯,說明如下:1. 在/project/setting/link下的object/library modules中加上wtuxws32.lib,如圖所示:2. 在tools/options/directories下的show direcries中選include files,然后加上TUXEDO的INCLUDE目錄,如圖所示:3. 在tools/options/directories下的show direcries中選library files,然后加上TUXEDO的LIB目錄,如圖所示:7.5采用PB編寫客戶端程序1. ATMI函數(shù)的聲明對PB,VB,DELPHI,VC等客戶端,TUXE

27、DO提供一個(gè)DLL編程接口,該DLL文件名為wtuxws32.dll,首先要在這些語言中聲明所要用到的函數(shù)。因?yàn)镻B中沒有指針,我們把它們聲明為LONG型。如果是雙重指針,可聲明為ref long. 下面聲明采用PB編寫CLIENT段程序常用到的函數(shù)function integer tpinit( long tpinfo ) library "wtuxws32.dll"function integer tpterm( ) LIBRARY "wtuxws32.dll"function long tpalloc( string buftype, string

28、 subtype, long bufsize ) LIBRARY "wtuxws32.dll"function long lstrcpyPtr( long buffer, string str ) library "kernel32.dll" alias for lstrcpyfunction long lstrcpyStr( ref string str, long buffer ) library "kernel32.dll" alias for lstrcpyfunction integer tpcall(string svcn

29、ame, long ibuffer , long ilen, ref long obuffer, ref long olen, long flags ) library "wtuxws32.dll"subroutine tpfree( long buffer ) library "wtuxws32.dll"function integer gettperrno( ) library "wtuxws32.dll"function string tpstrerror( integer errno ) library "wtuxw

30、s32.dll"function integer tperrordetail( long flag ) library "wtuxws32.dll"function string tpstrerrordetail( integer errno, long flag ) library "wtuxws32.dll"function integer fchgd32( long fbfr, long fldif, long occ,ref double buf, long flen ) library "wtuxws32.dll"

31、 alias for Fchg32function integer fchgl32( long fbfr, long fldif, long occ,ref long buf, long flen ) library "wtuxws32.dll" alias for Fchg32function integer fchgs32( long fbfr, long fldif, long occ, string buf, long flen ) library "wtuxws32.dll" alias for Fchg32function integer g

32、etFerror32() library "wtuxws32.dll" alias for getFerror32function string Fstrerror32(integer errno) library "wtuxws32.dll" alias for Fstrerror32function integer fgets32( long fbfr, long fldid, long occ, ref string buf, ref long flen ) library "wtuxws32.dll" alias for Fg

33、et32function integer fgetd32( long fbfr, long fldid, long occ, ref double buf, ref long flen ) library "wtuxws32.dll" alias for Fget32function integer fgetl32( long fbfr, long fldid, long occ, ref long buf, ref long flen ) library "wtuxws32.dll" alias for Fget32function long focc

34、32( long fbfr, long fldid ) library "wtuxws32.dll" alias for Foccur32function long fneeded32( long occ, long len) library "wtuxws32.dll" function long flen32( long fbfr, long id, long occ) library "wtuxws32.dll" alias for Flen32function long fprint32( long fbfr) library

35、 "wtuxws32.dll" alias for Fprint32Function Long foccur32(Long RCVBUF,long FLDID ) LIBRARY "wtuxws32.dll" alias for "Foccur32"Function Long finit32(Long RCVBUF,long BUFSIZE) LIBRARY "wtuxws32.dll" alias for "Finit32"Function Long tprealloc (Long buffe

36、r , Long BUFSIZE ) LIBRARY "wtuxws32.dll"function long fsizeof32(long fbfr) library "wtuxws32.dll"function integer tpenqueue( string qspace,string qname, REF TPQCTL ctl, long data, long len, long flags) library "wtuxws32.dll" function integer tpdequeue( string qspace,st

37、ring qname, REF TPQCTL ctl, REF long data, REF long len, long flags) library "wtuxws32.dll" 2. FML(FML32)緩沖區(qū)的定義在C,C+中FML32緩沖區(qū)中字段的ID在*.H文件中定義,在PB中可以把它們定義為常量3.編程方式的改變在兩層的C/S結(jié)構(gòu)中,客戶端直接訪問數(shù)據(jù)庫,當(dāng)采用TUXEDO中間件后,形成三層結(jié)構(gòu)。這時(shí),客戶端不直接訪問數(shù)據(jù)庫,而是改為調(diào)用中間件TUXEDO服務(wù)端上的服務(wù),由TUXEDO服務(wù)端訪問數(shù)據(jù)庫,并把結(jié)果返回給客戶端。所以這時(shí)候客戶端上不用安裝數(shù)據(jù)庫的客

38、戶端,PB中的數(shù)據(jù)窗口的數(shù)據(jù)源也只能采用外部數(shù)據(jù)源。因?yàn)镻B不能直接與數(shù)據(jù)庫建立連接.4.對存儲(chǔ)過程的處理推薦的做法是把存儲(chǔ)過程轉(zhuǎn)換為TUXEDO 的SERVICE,這樣做工作量比較大,但是完全的3層結(jié)構(gòu),另一種方式是存儲(chǔ)過程不變,用一個(gè)TUXEDO 的SERVICE去調(diào)用該存儲(chǔ)過程,把結(jié)果返回給客戶端.4.例子下面我們舉兩個(gè)例子來說明在PB中編寫TUXEDO客戶端程序的方法.為了方便在例子中調(diào)用,我們重新定義對FML32緩沖區(qū)進(jìn)行操作的函數(shù)如下:int pchgd32(long fbfr,long fldid,long occ,double buf)/*作用:寫一個(gè)浮點(diǎn)型數(shù)據(jù)到FML32緩沖

39、區(qū)的指定位置中輸入?yún)?shù):fbfr: FML32緩沖區(qū)fldid: ID號(hào)occ: 位置buf: 要寫入的浮點(diǎn)型數(shù)據(jù)輸入?yún)?shù):無返回值: 0 成功,-1失敗*/long flen =0long ferror =0flen=Flen32(fbfr,fldid,0);if fchgd32(fbfr,fldid,occ,buf,flen) = -1 thenferror = getferror32()MessageBox( "pchgd32(" + string(fldid) + ")出錯(cuò): ",fstrerror32(ferror)return -1end i

40、freturn 0int pchgl32(long fbfr,long fldid,long occ,long buf)/*作用:寫一個(gè)整型數(shù)據(jù)到FML32緩沖區(qū)的指定位置中輸入?yún)?shù):fbfr: FML32緩沖區(qū)fldid: ID號(hào)occ: 位置buf: 要寫入的整型數(shù)據(jù)輸入?yún)?shù):無返回值: 0 成功,-1失敗*/long flen =0long ferror =0flen=Flen32(fbfr,fldid,0);if fchgl32(fbfr,fldid,occ,buf,flen) = -1 thenferror = getferror32()MessageBox( "pchg3

41、2(" + string(fldid) +")出錯(cuò): ",fstrerror32(ferror)return -1end ifreturn 0int pchgs32(long fbfr,long fldid,long occ,string buf)/*作用:寫一個(gè)字符型數(shù)據(jù)到FML32緩沖區(qū)的指定位置中輸入?yún)?shù):fbfr: FML32緩沖區(qū)fldid: ID號(hào)occ: 位置buf: 要寫入的字符型數(shù)據(jù)輸入?yún)?shù):無返回值: 0 成功,失敗返回相應(yīng)的*/long ll_len=0long ll_error=0ll_len=len(buf)if fchgs32(fbfr

42、,fldid,occ,buf,ll_len) = -1 thenll_error = getferror32()MessageBox( "fchgs32(" + string(fldid) + ")出錯(cuò): ",fstrerror32(ll_error)return -1end ifreturn 0int pgetd32(long fbfr,long fldid,long occ, ref double buf)/*作用:從FML32緩沖區(qū)的指定位置中取浮點(diǎn)型數(shù)據(jù)到輸入?yún)?shù)BUF中輸入?yún)?shù):fbfr: FML32緩沖區(qū)fldid: ID號(hào)occ: 位置bu

43、f: 取出的數(shù)據(jù)儲(chǔ)存到BUF中輸入?yún)?shù):無返回值: 0 成功,-1失敗*/long ll_flen =0long ll_ferror =0double lf_tmp=0if fgetd32(fbfr, fldid, occ, lf_tmp, ll_flen) = -1 thenll_ferror = getferror32()MessageBox( "fgetl32(" + string(fldid) + ")出錯(cuò): ",fstrerror32(ll_ferror)return -1end ifbuf = lf_tmpreturn 0int pgetl3

44、2(long fbfr,long fldid,long occ, ref long buf)/*作用:從FML32緩沖區(qū)的指定位置中取整型數(shù)據(jù)到輸入?yún)?shù)BUF中輸入?yún)?shù):fbfr: FML32緩沖區(qū)fldid: ID號(hào)occ: 位置buf: 取出的數(shù)據(jù)儲(chǔ)存到BUF中輸入?yún)?shù):無返回值: 0 成功,-1失敗*/long ll_flen =0long ll_ferror =0long ll_tmp=0if fgetl32(fbfr, fldid, occ, ll_tmp, ll_flen) = -1 thenll_ferror = getferror32()MessageBox( "fg

45、etl32(" + string(fldid) + ")出錯(cuò): ",fstrerror32(ll_ferror)return -1end ifbuf = ll_tmpreturn 0int pgetd32(long fbfr,long fldid,long occ, ref string buf)/*作用:從FML32緩沖區(qū)的指定位置中取字符型數(shù)據(jù)到輸入?yún)?shù)BUF中輸入?yún)?shù):fbfr: FML32緩沖區(qū)fldid: ID號(hào)occ: 位置buf: 取出的數(shù)據(jù)儲(chǔ)存到BUF中(長度不能超過1000)輸入?yún)?shù):無返回值: 0 成功,-1失敗*/long ll_flen =

46、0long ll_ferror =0string ls_tmplong ll_len=0ll_len = flen32(fbfr,fldid,occ)if ll_len = -1 thenll_ferror = getferror32()MessageBox( "flen32()出錯(cuò): ",fstrerror32(ll_ferror)return -1end ifls_tmp = space(ll_len)if ls_tmp="" thenmessagebox("提示","space()出錯(cuò)")return -1e

47、nd ifif fgets32(fbfr, fldid, occ, ls_tmp, ll_flen) = -1 thenll_ferror = getferror32()MessageBox( "fgets32(" + string(fldid) + ")出錯(cuò): ",fstrerror32(ll_ferror)return -1end ifbuf = ls_tmpreturn 0例子中用到的FML32文件 myfml的內(nèi)容:*base1000EMPNO1long-ENAME2string-JOB3stringMGR4longHIREDATE5string

48、SAL6doubleCOMM7doubleDEPTNO8longROW 9 long - -ERRINFO 10 string - -SQLCODE 11 long - -SQLTEXT 12 string - -CROSSTAB13 string - -NODENO14 string - -BEGIN_DATE15 string - -END_DATE16 string - -對應(yīng)的myfml.h的內(nèi)容:/*fnamefldid */*- */#defineEMPNO(FLDID32)33555433)/* number: 1001 type: long */#defineENAME(FLD

49、ID32)167773162)/* number: 1002 type: string */#defineJOB(FLDID32)167773163)/* number: 1003 type: string */#defineMGR(FLDID32)33555436)/* number: 1004 type: long */#defineHIREDATE(FLDID32)167773165)/* number: 1005 type: string */#defineSAL(FLDID32)134218734)/* number: 1006 type: double */#defineCOMM(

50、FLDID32)134218735)/* number: 1007 type: double */#defineDEPTNO(FLDID32)33555440)/* number: 1008 type: long */#defineROW(FLDID32)33555441)/* number: 1009 type: long */#defineERRINFO(FLDID32)167773170)/* number: 1010 type: string */#defineSQLCODE(FLDID32)33555443)/* number: 1011 type: long */#defineSQ

51、LTEXT(FLDID32)167773172)/* number: 1012 type: string */#defineCROSSTAB(FLDID32)167773173)/* number: 1013 type: string */在PB中的定義為INSTANCE 變量:例子一:在PB中調(diào)用EMP_SEL,往EMP表中插入一條記錄,并把該表中的記錄全部取出,在客戶端的數(shù)據(jù)窗口中顯示出來PB客戶端數(shù)據(jù)窗口定義:數(shù)據(jù)窗口D_EMP的數(shù)據(jù)源只能采用外部數(shù)據(jù)源,定義如下:PB客戶端程序如下:long ll_sendbuf=0long ll_rcvbuf=0long ll_sendlen=0lo

52、ng ll_rcvlen=0long ll_tperrno=0long ll_empno=1000string ls_ename='scott'string ls_job='computer'long ll_mgr=2345date ld_hiredate = date('2001/01/01')double lf_sal=30000.45double lf_comm=1234.5long ll_deptno=30string ls_tuxerr=""long lL_sqlcode=0string ls_sqlerr=&quo

53、t;"long i=0long j=0long ll_row =0string ls_hiredate=""dw_emp.reset()/與TUXEDO服務(wù)器建立連接if tpinit(0) = -1 thenMessageBox( "tpinit() failure", tpstrerror(gettperrno(), Information!, OkCancel! )tpterm( )returnend if/分配FML32發(fā)送緩沖區(qū)ll_sendlen = 12000ll_sendbuf = tpalloc("FML32&quo

54、t;, "", ll_sendlen)if ll_sendbuf = 0 thenMessageBox( "tpalloc(ll_sendbuf) failure", tpstrerror(gettperrno(), Information!, OkCancel! )returnend if/分配FML32接收緩沖區(qū)ll_rcvlen = 12000ll_rcvbuf=tpalloc("FML32","",ll_rcvlen)if ll_rcvbuf = 0 thentpfree(ll_sendbuf)Messag

55、eBox( "tpalloc(ll_rcvbuf) failure", tpstrerror(gettperrno(), Information!, OkCancel! )returnend if/清空緩沖區(qū)if Finit32(ll_sendbuf,ll_sendlen) = -1 or & Finit32(ll_rcvbuf,ll_rcvlen) = -1 thenMessageBox("Finit32() failure", tpstrerror(gettperrno()tpfree(ll_sendbuf)tpfree(ll_rcvbuf)tpterm()returnend if/傳給服務(wù)器端的參數(shù)if pchgl32(ll_sendbuf,EMPNO,0,ll_empno) = -1 or &pchgs32(ll_sendbuf,ENAME,0,ls_ename) = -1 or & pchgs32(ll_sendbuf,JOB,0,ls_job) = -1 or &pchgl32(ll_sendbuf,MGR,0,ll_mgr) = -1 or &pchgd32(ll_sendbuf,SAL,0,lf_sal) = -1 or &pchgd32(ll_sendbuf,COM

溫馨提示

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

評(píng)論

0/150

提交評(píng)論