三、服务端的程序:s.pc
功能:根据客户端传的EMPNO到表EMP中取ENAME的值,并把它返回给客户端
#i nclude <stdio.h>
#i nclude <atmi.h>
#i nclude <userlog.h>
EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
int al_empno=0;
char ac_ename[11]= "";
EXEC SQL VAR ac_ename IS STRING(11);
EXEC SQL END DECLARE SECTION;
TEST(TPSVCINFO *rqst)
{
/*接收客户端来的数据*/
al_empno = atoi((FBFR32 *)rqst->data);
EXEC SQL select ename into :ac_ename from EMP where empno=:al_empno;
if(sqlca.sqlcode!=0)
{
userlog( "select from EMP failure,sqlcode=%ld, sqlerr=%s\n ",sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
strcpy(rqst->data,sqlca.sqlerrm.sqlerrmc);
tpreturn( TPFAIL, 0, rqst->data, 0, 0 );
}
/*把取出的结果返回给客户端*/
strcpy(rqst->data,ac_ename);
tpreturn( TPSUCCESS, 0, rqst->data, 0, 0 );
}
四、编写客户端程序: c.c
功能:调用TUXEDO服务端的服务TEST,取EMPNO=1000所对应的ENAME的值,并显示出来
#i nclude <stdio.h>
#i nclude "atmi.h "
main(argc, argv)
{
long reqlen=1024;
char *reqbuf;
/* 与TUXEDO服务端建立连接 */
if (tpinit((TPINIT *) NULL) == -1)
{
(void) fprintf(stderr, "Tpinit failed\n ");
exit(1);
}
/* 分配发送缓冲区*/
reqbuf = (char *)tpalloc( "STRING ",NULL,reqlen);
if ( reqbuf == (char *)NULL)
{
printf( "tpalloc failed\n ");
tpterm();
}
strcpy(reqbuf, "1000 ");
/*调用TUXEDO的服务TEST*/
if (tpcall( "TEST ", (char *)reqbuf, 0L, (char **)&reqbuf, (long *)&reqlen, 0< 0 )
{
printf( "tpcall failed,tperrno=%ld,tperrtext=%s\n ",tperrno,tpstrerror(tperrno));
tpfree(reqbuf);
tpterm();
exit(1);
}
printf( "name=%s\n ",reqbuf);
tpfree(reqbuf);
tpterm();
return(0);
}
五、编译服务端程序
1. 用ORACLE的PROC把s.pc 文件预编译成s.c文件
使用proc*c 可视化工具,参数[sqlcheck=semantics include=D:\Progra~1\tuxedo8.1\include]
当使用tuxedo的函数时要include选项
2.用buildserver把s.c编译成可执行文件,注意-r 后带的Oracle_XA 与RM文件中的一致。
d:\test> buildserver -o testserv -f s.c -r Oracle_XA -s TEST
六、编译客户端程序
d:\test> buildclient -o c -f c.c ,设置WNSADDR值即可:WSNADDR=192.168.9.122:3001
值与ubb中:CLOPT= "-A -t -- -n //192.168.9.122:3001 -m 5 -M 10 -x 3 "
对应
七、用 tmboot –y 启动TUXEDO
应能看到所有的SERVER都启动成功。这时,我们的服务端程序s.exe 会自动与ORACLE数据库建立连接,并一直保持这个连接,��到TUXEDO系统或ORACLE数据库关闭。所以在我们的程序test.pc中看不到与数据库连接的语句,因为现在与数据库的连接由TUXEDO自动管理。如果TMS_ORA9i启动失败会在当前目录生成一个*.trc文件,记录失败的原因,同时TUXEDO的ULOG文件中也会有一些错误信息。可参考这些错误信息进行错误分析。
d:\test> tmboot -y
exec TMS_ORA8i-A :
process id=1072 ... Started.
exec TMS_ORA8i-A :
process id=528 ... Started.
exec test -A :
process id=876 ... Started.
八、运行客户端程序
运行后应能看到服务端返回的结果。
到此,整个配置过程就大功告成了。ORACLE的其他版本的配置及在其他操作系统上的配置基本与本文所述差不多,差别主要在RM文件中所连的库文件可能会不样。
一、如果按以上步骤:各步(特别是proc*c连接数据库编译也成功)都成功后,tmboot时TMS_ORA9i 等启动失败,可能是数据库属性不对,
Enterprise manager Configuration Assistant 创建的数据库已经通过测试,
用Database Configuration Assistant,使数据库属性同上,应该也可以成功,因为上面也是调用
Database Configuration Assistant来创建的数据库 。
二、PROC*C提示连接不上:使用档案用户登陆
使用档案用户,提示语法错误,而仅检查语法时说没有错误:确认是否有权限操作该表
三、客户端的WNSADDR值更改后,客户端要重新编译?不需要