return end if
//取返回的记录数
ll_row = Foccur32(ll_rcvbuf,CROSSTAB) //如果没有数据返回 if ll_row =0 then
//退出时要注意释放已分配的缓冲区,并调用TPTERM() tpfree( ll_sendbuf ) tpfree( ll_rcvbuf ) tpterm()
messagebox(\提示\没有符合条件的记录\ return end if
//从返回的缓冲区中取记录并把记录插到数据窗口中 string ls_rowdata=\for i = 0 to ll_row -1
if pgets32(ll_rcvbuf, CROSSTAB, i, ls_rowdata) = -1 then //退出时要注意释放已分配的缓冲区,并调用TPTERM() tpfree( ll_sendbuf ) tpfree( ll_rcvbuf ) tpterm() return end if
j=dw_crosstab.insertrow(0)
if dw_crosstab.setitem(j,'rowdata',ls_rowdata) = -1 then messagebox(\ end if next
//退出时要注意释放已分配的缓冲区,并调用TPTERM() tpfree( ll_sendbuf ) tpfree( ll_rcvbuf ) tpterm() return
服务端程序Pbserver.cpp的内容:
#include
EXEC SQL INCLUDE sqlca;
/*RELEASE_CURSOR=YES 使PROC 在执行后释放与嵌入SQL有关资源*/ EXEC ORACLE OPTION (RELEASE_CURSOR = YES);
#define SQLNOTFOUND 1403 /*SELECT没取到数据*/
#define SQLNULL -1405 /*当取出的值是null时,sqlca.sqlcode = -1405*/ #define _DEBUG_ /*调试*/
EXEC SQL BEGIN DECLARE SECTION; /*定义输入参数:*/ long al_empno=0; long al_mgr=0; long al_deptno=0; char ac_ename[11]=\ char ac_job[10]=\
char ac_hiredate[20]=\ double af_sal=0; double af_comm=0; long l_errno=0; long l_return=0;
char c_errtext[256]=\ char c_tmp[256]=\
/*重新定义STRING变量,使其自动加上'\\0',如果是CHAR形的则不能重新定义成STRING变量*/
EXEC SQL VAR ac_ename IS STRING(11); EXEC SQL VAR ac_job IS STRING(10); EXEC SQL VAR ac_hiredate IS STRING(20); EXEC SQL VAR c_tmp IS STRING(256);
EXEC SQL END DECLARE SECTION;
/*出错返回*/
int tux_return(FBFR32 *sendbuf, char *szErrInfo,long sqlcode,char *szErrText) {
FLDLEN32 len=0;
len=sizeof(szErrInfo);
Fchg32(sendbuf, ERRINFO, 0,szErrInfo, len); len = sizeof(sqlcode);
Fchg32( sendbuf, SQLCODE, 0, (char *)&sqlcode, len); len=sizeof(szErrText);
Fchg32(sendbuf, SQLTEXT, 0,szErrText, len);
userlog(\ tpreturn(TPFAIL, 0, (char *)sendbuf, 0L, 0); return 0; }
/*分配返回缓冲区并初始化*/ FBFR32* IniSendBuf(int iSize) {
FBFR32 *sendbuf=NULL; FLDLEN32 len=0;
sendbuf = (FBFR32 *)tpalloc( \ if(sendbuf==(FBFR32 *)NULL) {
userlog(\ return NULL; }
len = Fsizeof32(sendbuf); (void)Finit32(sendbuf,len);
(void)Fchg32(sendbuf, ERRINFO, 0, \ (void)Fchg32(sendbuf, SQLCODE, 0, 0, (FLDLEN32)0); (void)Fchg32(sendbuf, ERRTEXT, 0, \ return sendbuf; }
int tpsvrinit(int argc, char **argv) {
if(tpopen()==-1) {
userlog(\ return -1; }
return 0; }
void tpsvrdone() {
if(tpclose()==-1) {
userlog(\ } } /*
接收客户端传送来的数据,并把数据插入到表EMP中,然后把该表EMP中的记录全部取出,返回给客户端 */
EMP_SEL(TPSVCINFO *rqst) {
FBFR32 *rcvbuf=NULL; FBFR32 *sendbuf=NULL; FLDLEN32 len=0; int i=0;
/*分配返回缓冲区并初始化*/ sendbuf = IniSendBuf(20480); if(sendbuf==NULL) {
tpreturn( TPFAIL, 0, (char *)sendbuf, 0, 0 ); }
/*取出客户端传送过来的数据*/ rcvbuf=(FBFR32 *)rqst->data; len=sizeof(al_empno);
if(Fget32(rcvbuf,EMPNO,0,(char *)&al_empno,&len) == -1) {
tux_return(sendbuf,\ }
len = sizeof(ac_ename); ac_ename[0]='\\0';
if(Fget32(rcvbuf,ENAME,0,ac_ename,&len)== -1) {
tux_return(sendbuf,\}
len=sizeof(ac_job); ac_job[0]='\\0';
if(Fget32(rcvbuf,JOB,0,ac_job,&len)== -1) {
tux_return(sendbuf,\}
len = sizeof(al_mgr);
if(Fget32(rcvbuf,MGR,0,(char*)&al_mgr,&len) == -1) {
tux_return(sendbuf,\}
len=sizeof(ac_hiredate); ac_hiredate[0]='\\0';
if(Fget32(rcvbuf,HIREDATE,0,ac_hiredate,&len) == -1) {
tux_return(sendbuf,\fail\*)Fstrerror32(Ferror32)); }
len=sizeof(af_sal);
if(Fget32(rcvbuf,SAL,0,(char *)&af_sal,&len) == -1) {
tux_return(sendbuf,\}
len=sizeof(af_comm);
if(Fget32(rcvbuf,COMM,0,(char*)&af_comm,&len) == -1) {
tux_return(sendbuf,\fail\*)Fstrerror32(Ferror32)); }
len=sizeof(al_deptno);
if(Fget32(rcvbuf,DEPTNO,0,(char*)&al_deptno,&len) == -1) {
tux_return(sendbuf,\}
/*开始一个全局事务*/
if (tpbegin(30, 0) == -1) {
TUXEDO的客户端编程



