第七章TU_EDO的客戶端編程-融金教育.doc_第1頁
第七章TU_EDO的客戶端編程-融金教育.doc_第2頁
第七章TU_EDO的客戶端編程-融金教育.doc_第3頁
第七章TU_EDO的客戶端編程-融金教育.doc_第4頁
第七章TU_EDO的客戶端編程-融金教育.doc_第5頁
已閱讀5頁,還剩31頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第七章:TUXEDO的客戶端編程7.1 Tuxedo的客戶端簡介:tuxedo有兩種客戶端: 本地客戶端和遠程客戶端。NATIVE CLIENT(本地客戶端): 是指與TUXEDO服務器在同一臺機器上,不用通過網絡就可以訪問到TUXEDO服務器的客戶端 。WORSTATION CLIENT(本地客戶端):是指要通過網絡才可以訪問到TUXEDO服務器的客戶端。下圖為TUXEDO應用系統的客戶端訪問TUXEDO服務器上的服務的過程圖。說明:WS(Workstation Extension Product) 用于指TUXEDO產品的客戶端部分WSC Workstation ClientWSL(Workstation Listener)TUXEDO系統自帶的一個SERVER,它偵聽一個指定的端口,WSC最初與該SERVER建立連接WSH(Workstation Handler)TUXEDO系統自帶的一個SERVER,由它處理WSC與TUXEDO SERVER之間的通訊。Bulletin Board(公告板)TUXEDO把系統的配置保存在一個共享內存中,該共享內存稱為公告板(BB)BBLTUXEDO的管理進程,主要對公告板等進行管理Workstation Client與TUXEDO SERVER建立連接的過程為:1 WSC 調用tpinit()或tpchkauth()2 WSC采用在WSNADDR中指定的IP地址與服務端的WSL建立連接3 WSL為該WSC指定一個WSH,并把該WSH的偵聽端口返回給WSC4 WSC采用返回的端口與指定的WSH建立連接,并與WSL斷開連接,這之后WSC與TUXEDO SERVER之間的通訊通過WSH進行處理,與WSL無關。5 tpinit()或tpchkauth()調用返回。本地客戶端與遠程客戶端的主要區別1. 本地客戶端只能用C語言或COBAL語言編寫,遠程客戶端可以用幾乎所有的編程語言編寫。2. 在遠程客戶端所在的機器上要安裝TUXEDO的客戶端軟件,并且在設置相應的環境變量;在本地客戶端上不用3. 用buildclient編譯遠程客戶端程序時要加 W,編譯本地客戶端則不用與遠程客戶端有關的配置:1 在MACHINES中要配置MAXWSCLIENTS,即最多可以有多少個遠程客戶端同時連接到該服務器上。2 在SERVERS中要配置SERVER:WSLWSL SRVGRP=GROUP1 SRVID=1116 CLOPT=-A - -n /13:8888 -m 2 -M 5 -x 6CLOPT中可帶的參數為:CLOPT= -A servopts_options - -n netaddr -d device -w WSHname-t timeout_factor-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參數說明:-n netaddr: WSL的偵聽端口,遠程客戶端通過該端口與服務器建立連接-m minh : 最少啟動多少個WSH進程-M maxh: 最多啟動多少個WSH進程,默認值為MAXWSCLIENTS/m-x mpx_factor:每個WSH進程可以同時與多少個遠程客戶端建立連接-c compression_threshold如果在遠程客戶端與服務器之間傳送的數據包大小(單位為字節)超過-c指定的參數,就自動進行數據壓縮,-T Client_timeout: 指定一個遠程客戶端的空閑時間,如果該遠程客戶端在client_timeout這么長的時間內沒有做任何調用,WSH將斷開與該遠程客戶端的連接。單位為分鐘,如果沒有指點該參數,那么WSH永遠不會自動斷開遠程客戶端的連接-t timeout_factor: 指定遠程客戶端與WSH建立連接的時間,如果在-t指定的時間內還沒有建立連接,那么連接將失敗。如果沒有采用安全認證方式默認為3*SCANUNIT秒,。如果采用安全認證方式默認為6*SCANUNIT秒, -p minwshport-P maxwshport:指定WSH可以使用的端口范圍:如果遠程客戶端要跨越防火墻才能訪問該TUXEDO應用系統,在WSL中要指定該參數,指定WSH可以使用的端口范圍,并讓防火墻允許訪問這些端口。如果不指定,TUXEDO會根據系統端口的使用情況進行分配,而分配的端口防火墻不允許通過,造成CLIENT無法調用TUXEDO SERVER。如下面的設置指定WSH可用的端口范圍為17010 17030。WSLSRVGRP=GROUP1SRVID=1CLOPT=-A - -n /6:17009 -m 10 -M 10 -x 10 -p 17010 -P 17030在遠程客戶端的機器上要設置的環境變量TUXDIR (必需):TUXEDO客戶端在該機器上的安裝目錄WSNADDR(必需):遠程客戶端通過該IP地址與服務器建立連接,它的值為-n參數的值,如在上面的配置中為:SET WSNADDR= /13:8888WSTYPE(可選): 該客戶端的類型,如果與服務器的類型一樣,那么在它們之間進行數據傳送時不用進行編碼解碼工作。其他不常用的環境變量可參考TUXEDO的聯機文檔。客戶端的編程模式:在3層結構中,CLIENT是屬與表示層,表示層主要處理與用戶交互,它的功能可概括為:1、提供應用的用戶交互接口,即主要通過圖形化的用戶界面,取的用戶的輸入數據2、與TUXEDO 應用服務器建立連接3、調用TUXEDO應用服務器上的服務(SERVICE),把客戶端的輸入參數放入輸出緩沖區。4、TUXEDO應用服務器調用相應的SERVICE處理客戶端的請求,把處理結果通過客戶端的輸入緩沖區返回給客戶端。 客戶端與服務端之間的通訊方式有以下幾種:1、同步調用:2、異步調用3、會話方式:4、可靠消息隊列5、廣播方式6、發布/訂閱在下一章我們再具體介紹7.2 CLIENT的ATMI介紹客戶端通過調用TUXEDO提供的編程API(ATMI)來編寫程序,下面介紹一些客戶端主要的ATMI與連接的建立與斷開有關的ATMI為了與TUXEDO SERVER建立連接,TUXEDO CLIENT要調用TPCHKAUTH()檢查該TUXEDO SERVER所采用的安全方式,并根據得到的值做相應的處理,然后調用TPINIT()建立與TUXEDO的連接,在TUXEOD SERVER的結果返回之后,調用TPTERM()斷開與TUXEDO SERVER的連接.int tpchkauth()描述: 檢查該TUXEDO SERVER所采用的安全方式參數:無返回值: TPNOAUTH:不需要認證 TPSYSAUTH:需要口令認證 TPAPPSUTH:需要口令認證,并且還需要應用級的認證或授權. -1:調用失敗, 錯誤號保存在全局變量tperrno中。int tpinit(TPINIT *tpinfo)描述: 與TUXEDO SERVER建立連接參數:TPINFO返回值: 失敗返回-1, 錯誤號保存在全局變量tperrno中。TPINIT結構體在atmi.h中的定義如下structtpinfo_t char usrnameMAXTIDENT+2;/* client user name */char cltnameMAXTIDENT+2;/* application 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,grpname,data,datalen用于安全認證中flags:用于定義以何種方式通知該客戶端一個UNSOLICTED MESSAGE的到來.它的值可以為:TPU-SIGTPU-DIPTPU-IGNTPSA-FASTPATHTPSA-PROTECTEDint tpterm()描述: 斷開與TUXEDO SERVER建立連接參數:無返回值: 失敗返回-1, 錯誤號保存在全局變量tperrno中。與請求TUXEDO SERVER 有關的ATMIint tpcall(char *svc, char *idata, long ilen, char *odata, long *olen, long flags)描述:客戶端同步調用服務端的名為svc的SERVICE,參數: *svc:SERVICE的名稱char *idata: 輸入緩沖區的地址,客戶端傳給服務端的參數放在該緩沖區內long ilen: 輸入緩沖區的長度char *odata 輸出緩沖區的地址,服務端傳給客戶端的結果放在該緩沖區內long *olen:輸出緩沖區的長度 long flags: 調用標志,由以下幾個:TPNOTRAN如果調用svc的客戶端當前在TRANSACTION方式下,那么svc不參與當前的TRANSACTION。TPNOCHANGE如果服務端返回的緩沖區類型與客戶端定義的緩沖區(odata)類型不一致,默認情況下,odata會轉換成與服務端返回的緩沖區類型一致的類型,如果設置了該FLAG,那么當出現這種情況時,不進行緩沖區類型轉換,并且會保錯。TPNOBLOCK默認情況下,如果客戶端有阻塞條件存在(如CLIENT的TCP/IP中的緩沖區滿,磁盤I/O忙等),那么客戶端會阻塞在那里,直到阻塞消除或超時出錯。如果設置了TPNOBLOCK,當客戶端有阻塞條件存在時,TPCALL()會立刻返回并報錯. 注意TPNOBLOCK只對發送請求時起作用,如果在接收服務端返回的結果時有阻塞條件存在,客戶端會在那里等待,直到阻塞消除或超時出錯TPNOTIME如果客戶端有阻塞條件存在,客戶端會一直阻塞在那里,即使到了超時時間也不返回,但如果該客戶端是在TRANSACTION模式下,當到了事務的超時時間,還是會報超時錯誤并返回。TPSIGRSTRT如果在進行系統調用時,被信號中斷,該系統調用會重新進行。調用成功返回0,失敗返回-1, 錯誤號保存在全局變量tperrno中。int tpacall(char *svc, char *data, long len, long flags)描述: 客戶端異步調用服務端的名為svc的SERVICE,不等服務端返回結果,程序可繼續往下走,在某個地方調用tpgetrply()取的服務端的返回參數:char *svc, char *data, long len參數的含義與tpcall()中的一樣flags 可設置為:TPNOTRAN, TPNOREPLY, TPNOBLOCKTPNOTIME, TPSIGRSTRT.TPNOTRAN, TPNOBLOCKTPNOTIME, TPSIGRSTRT的含義與與tpcall()中的一樣TPNOREPLY:調用tpacall()的客戶端不想接收SEVER端的應答。如果設置了TPNOREPLY:服務端不會給該客戶端發送應答。返回值: 失敗返回-1,成功返回一個HANDLER,可作為tpgetrply的參數,用于取應答int tpgetrply(int *cd, char *data, long *len, long flags)描述:取出服務端對tpacall()的應答。參數: cd tpacall()返回的HANDLERchar *data返回緩沖區的地址,服務端傳給客戶端的結果放在該緩沖區內long *len:返回緩沖區的長度flags:可以是:TPNOBLOCK, TPNOTIME,TPSIGRSTRT,TPGETANY(不管cd的值,從服務器的應答隊列中取第一個可用的消息),TPNOCHANGE 返回值: 失敗返回-1,錯誤號保存在全局變量tperrno中。int tpcancel(int handle)描述: 如果當前的程序不處于事務模式中,取消對tpacall()的應答, 如果處于事務模式中,則不能取消對tpacall()的應答,該調用會失敗.參數: tpacall()返回的HANDLER返回值: 失敗返回-1,錯誤號保存在全局變量tperrno中。int tpgprio()描述:返回最近發送(tpcall(),tpacall()或接收(tpgetrply()的一個消息的優先級參數:無返回值: 1-100消息的優先級,值越高, 優先級越高 失敗返回-1, 錯誤號保存在全局變量tperrno中。struct int hdl; /* handle*/int pr; /* priority*/ paSIZE;for (i=0; irequests; i+) /* Determine service 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, &rlen, rflags);int tpsprio (int prio, long flags)描述: 設置下一個要發送的消息的優先級參數: 0- prio為相對值, 設置下一個要發送的消息的優先級為現在的優先級加上prio TPABSOLUTE: prio為絕對值, 設置下一個要發送的消息的優先級為prio返回值: 失敗返回-1,錯誤號保存在全局變量tperrno中。與請求錯誤處理有關的ATMIchar *tpstrerror(int tperrno) 描述:返回錯誤號為tperrno的錯誤描述參數: tperrno:在atmi.h中定義的全局變量,用于標識錯誤號,類似于C中的errno返回值: 失敗返回NULL,成功返回錯誤號為tperrno的錯誤描述.int tperrordetail(long flags)描述: 返回當前進程或線程最近調用ATMI的出錯的更詳細的描述參數:設為0返回值: 如果沒有錯誤返回0,有錯誤返回錯誤描述號char * tpstrerrordetail(int err, long flags)描述: 返回錯誤描述號err的詳細描述信息參數: err : tperrordetail()的返回值, flags: 設為0返回值: 失敗返回NULL,成功返回詳細描述信息7.3 采用C語言編寫TUXEDO的客戶端程序如果是采用C語言編寫TUXEDO的客戶端程序,可直接采用ATMI的函數,這些函數在atmi.h中定義.采用C語言編寫TUXEDO的客戶端的例子在此不列舉,可參考simpapp,bankapp等例子.采用C語言編寫客戶端的編譯是用buildclient命令進行的,它的使用格式如下:buildclient -C -v -w | -r rmname -o outfile -f firstfiles -l lastfiles參數說明:-C: 編譯用COBOL寫的客戶端 -v: 輸出詳細的編譯信息-w: 編譯成REMOTE CLIENT,如果不帶該參數,那么將編譯成NATIVE CLIENT.-o: 編譯生成的可執行文件名-f: 要編譯的C文件名-l: 指定要編譯生成該可執行文件名要連接的其他庫文件,如果有多個庫文件要連接,它們之間用空格隔開.-r: 指定該CLIENT要連接的RMbuildclient 調用C或C+編譯器來進行編譯工作.所以客戶端所在的機器要有C,C+編譯器才能編譯C客戶端的程序.如果是WINDOWS客戶端,可安裝VC,并在DOS環境下編譯C客戶端的程序. 如果在安裝VC時沒有把自動設置環境變量的選項選上,VC中設置環境變量的文件在VC安裝目錄下的binvcvars32.bat中,可手工執行它或在設置環境變量的文件中用CALL調用它,如:call d:vs6vc98binvcvars32.batset TUXDIR=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環境變量中設置所用的C編譯器路徑.7.4 采用VC編寫TUXEDO客戶端程序采用VC編寫客戶端程序與采用C語言編寫客戶端的方式一樣,但要對VC要進行一些設置才能進行編譯,說明如下: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函數的聲明對PB,VB,DELPHI,VC等客戶端,TUXEDO提供一個DLL編程接口,該DLL文件名為wtuxws32.dll,首先要在這些語言中聲明所要用到的函數。因為PB中沒有指針,我們把它們聲明為LONG型。如果是雙重指針,可聲明為ref long. 下面聲明采用PB編寫CLIENT段程序常用到的函數function integer tpinit( long tpinfo ) library wtuxws32.dllfunction integer tpterm( ) LIBRARY wtuxws32.dllfunction long tpalloc( string buftype, string subtype, long bufsize ) LIBRARY wtuxws32.dllfunction 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 svcname, long ibuffer , long ilen, ref long obuffer, ref long olen, long flags ) library wtuxws32.dllsubroutine tpfree( long buffer ) library wtuxws32.dllfunction integer gettperrno( ) library wtuxws32.dllfunction string tpstrerror( integer errno ) library wtuxws32.dllfunction integer tperrordetail( long flag ) library wtuxws32.dllfunction string tpstrerrordetail( integer errno, long flag ) library wtuxws32.dllfunction integer fchgd32( long fbfr, long fldif, long occ,ref double buf, long flen ) library wtuxws32.dll 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 getFerror32() 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 Fget32function 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 focc32( 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 wtuxws32.dll alias for Fprint32Function Long foccur32(Long RCVBUF,long FLDID ) LIBRARY wtuxws32.dll alias for Foccur32Function Long finit32(Long RCVBUF,long BUFSIZE) LIBRARY wtuxws32.dll alias for Finit32Function Long tprealloc (Long buffer , Long BUFSIZE ) LIBRARY wtuxws32.dllfunction long fsizeof32(long fbfr) library wtuxws32.dllfunction integer tpenqueue( string qspace,string qname, REF TPQCTL ctl, long data, long len, long flags) library wtuxws32.dll function integer tpdequeue( string qspace,string qname, REF TPQCTL ctl, REF long data, REF long len, long flags) library wtuxws32.dll 2. FML(FML32)緩沖區的定義在C,C+中FML32緩沖區中字段的ID在*.H文件中定義,在PB中可以把它們定義為常量3.編程方式的改變在兩層的C/S結構中,客戶端直接訪問數據庫,當采用TUXEDO中間件后,形成三層結構。這時,客戶端不直接訪問數據庫,而是改為調用中間件TUXEDO服務端上的服務,由TUXEDO服務端訪問數據庫,并把結果返回給客戶端。所以這時候客戶端上不用安裝數據庫的客戶端,PB中的數據窗口的數據源也只能采用外部數據源。因為PB不能直接與數據庫建立連接.4.對存儲過程的處理推薦的做法是把存儲過程轉換為TUXEDO 的SERVICE,這樣做工作量比較大,但是完全的3層結構,另一種方式是存儲過程不變,用一個TUXEDO 的SERVICE去調用該存儲過程,把結果返回給客戶端.4.例子下面我們舉兩個例子來說明在PB中編寫TUXEDO客戶端程序的方法.為了方便在例子中調用,我們重新定義對FML32緩沖區進行操作的函數如下:int pchgd32(long fbfr,long fldid,long occ,double buf)/*作用:寫一個浮點型數據到FML32緩沖區的指定位置中輸入參數:fbfr: FML32緩沖區fldid: ID號occ: 位置buf: 要寫入的浮點型數據輸入參數:無返回值: 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) + )出錯: ,fstrerror32(ferror)return -1end ifreturn 0int pchgl32(long fbfr,long fldid,long occ,long buf)/*作用:寫一個整型數據到FML32緩沖區的指定位置中輸入參數:fbfr: FML32緩沖區fldid: ID號occ: 位置buf: 要寫入的整型數據輸入參數:無返回值: 0 成功,-1失敗*/long flen =0long ferror =0flen=Flen32(fbfr,fldid,0);if fchgl32(fbfr,fldid,occ,buf,flen) = -1 thenferror = getferror32()MessageBox( pchg32( + string(fldid) +)出錯: ,fstrerror32(ferror)return -1end ifreturn 0int pchgs32(long fbfr,long fldid,long occ,string buf)/*作用:寫一個字符型數據到FML32緩沖區的指定位置中輸入參數:fbfr: FML32緩沖區fldid: ID號occ: 位置buf: 要寫入的字符型數據輸入參數:無返回值: 0 成功,失敗返回相應的*/long ll_len=0long ll_error=0ll_len=len(buf)if fchgs32(fbfr,fldid,occ,buf,ll_len) = -1 thenll_error = getferror32()MessageBox( fchgs32( + string(fldid) + )出錯: ,fstrerror32(ll_error)return -1end ifreturn 0int pgetd32(long fbfr,long fldid,long occ, ref double buf)/*作用:從FML32緩沖區的指定位置中取浮點型數據到輸入參數BUF中輸入參數:fbfr: FML32緩沖區fldid: ID號occ: 位置buf: 取出的數據儲存到BUF中輸入參數:無返回值: 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) + )出錯: ,fstrerror32(ll_ferror)return -1end ifbuf = lf_tmpreturn 0int pgetl32(long fbfr,long fldid,long occ, ref long buf)/*作用:從FML32緩沖區的指定位置中取整型數據到輸入參數BUF中輸入參數:fbfr: FML32緩沖區fldid: ID號occ: 位置buf: 取出的數據儲存到BUF中輸入參數:無返回值: 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( fgetl32( + string(fldid) + )出錯: ,fstrerror32(ll_ferror)return -1end ifbuf = ll_tmpreturn 0int pgetd32(long fbfr,long fldid,long occ, ref string buf)/*作用:從FML32緩沖區的指定位置中取字符型數據到輸入參數BUF中輸入參數:fbfr: FML32緩沖區fldid: ID號occ: 位置buf: 取出的數據儲存到BUF中(長度不能超過1000)輸入參數:無返回值: 0 成功,-1失敗*/long ll_flen =0long ll_ferror =0string ls_tmplong ll_len=0ll_len = flen32(fbfr,fldid,occ)if ll_len = -1 thenll_ferror = getferror32()MessageBox( flen32()出錯: ,fstrerror32(ll_ferror)return -1end ifls_tmp = space(ll_len)if ls_tmp= thenmessagebox(提示,space()出錯)return -1end ifif fgets32(fbfr, fldid, occ, ls_tmp, ll_flen) = -1 thenll_ferror = getferror32()MessageBox( fgets32( + string(fldid) + )出錯: ,fstrerror32(ll_ferror)return -1end ifbuf = ls_tmpreturn 0例子中用到的FML32文件 myfml的內容:*base1000EMPNO1long-ENAME2string-JOB3stringMGR4longHIREDATE5stringSAL6doubleCOMM7doubleDEPTNO8longROW 9 long - -ERRINFO 10 string - -SQLCODE 11 long - -SQLTEXT 12 string - -CROSSTAB13 string - -NODENO14 string - -BEGIN_DATE15 string - -END_DATE16 string - -對應的myfml.h的內容:/*fnamefldid */*- */#defineEMPNO(FLDID32)33555433)/* number: 1001 type: long */#defineENAME(FLDID32)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(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 */#defineSQLTEXT(FLDID32)167773172)/* number: 1012 type: string */#defineCROSSTAB(FLDID32)167773173)/* number: 1013 type: string */在PB中的定義為INSTANCE 變量:例子一:在PB中調用EMP_SEL,往EMP表中插入一條記錄,并把該表中的記錄全部取出,在客戶端的數據窗口中顯示出來PB客戶端數據窗口定義:數據窗口D_EMP的數據源只能采用外部數據源,定義如下:PB客戶端程序如下:long ll_sendbuf=0long ll_rcvbuf=0long ll_sendlen=0long ll_rcvlen=0long ll_tperrno=0long ll_empno=1000string ls_ename=scottstring ls_job=computerlong 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=long i=0long j=0long ll_row =0string ls_hiredate=dw_emp.reset()/與TUXEDO服務器建立連接if tpinit(0) = -1 thenMessageBox( tpinit() failure, tpstrerror(gettperrno(), Information!, OkCancel! )tpterm( )returnend if/分配FML32發送緩沖區ll_sendlen = 12000ll_sendbuf = tpalloc(FML32, , ll_sendlen)if ll_sendbuf = 0 thenMessageBox( tpalloc(ll_sendbuf) failure, tpstrerror(gettperrno(), Information!, OkCancel! )returnend if/分配FML32接收緩沖區ll_rcvlen = 12000ll_rcvbuf=tpalloc(FML32,ll_rcvlen)if ll_rcvbuf = 0 thentpfree(ll_sendbuf)MessageBox( tpalloc(ll_rcvbuf) failure, tpstrerror(gettperrno(), Information!, OkCancel! )returnend if/清空緩沖區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/傳給服務器端的參數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 &pchg

溫馨提示

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

評論

0/150

提交評論