免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1745 | 回复: 6
打印 上一主题 下一主题

请各位高手朋友指点,是C程序有问题吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-30 11:14 |只看该作者 |倒序浏览
20可用积分
#include <stdio.h>
#include <stdlib.h>
#include "atmi.h"

main(argc, argv)
{
        long reqlen=1024;
        char *reqbuf;
        /* create connection to server side of tuxedo */
        if(tpinit((TPINIT *)NULL)==-1)
        {
                (void)fprintf(stderr, "Tpinit failed!\n");
                exit(1);
        }

        /* allocate buffer of send */
        reqbuf=(char *)tpalloc("STRING", NULL, reqlen);
        if(reqbuf==(char *)NULL)
        {
                printf("tpalloc failed!\n");
                tpterm();
        }
        strcpy(reqbuf, "7844");

        /* call service TEST1 */
        if(tpcall("TEST1", (char *)reqbuf, 0L, (char **)&reqbuf, (long *)&reqlen, 0)<0)
        {----老实和尚好像说这两个参数都用reqbuf似乎不妥,但是程序运行中倒没报错,有没有人支持老实和尚观点的?
                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);
}
==============
我用以上这个c程序作客户端,去调用Tuxedo的服务TEST1,
==============
Tuxedo的服务端程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <atmi.h>
#include <userlog.h>

EXEC SQL INCLUDE sqlca;

EXEC SQL BEGIN DECLARE SECTION;
        long al_empno=0;---应该用char *al_empno;
        char ac_ename[11]="";
EXEC SQL VAR ac_ename IS STRING(20);
EXEC SQL END DECLARE SECTION;

TEST1(TPSVCINFO *rqst)
{
        /* receive empno from client to get ename from emp */
        al_empno=(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);
        }
        /* return result to client */
        strcpy(rqst->data, ac_ename);
        tpreturn(TPSUCCESS, 0, rqst->data, 0, 0);
}
===============================
以上是Tuxedo的服务端程序,先用proc预编译,然后用buildserver编译成test1可执行文件,最后用tmboot启动,可是执行客户端程序时总是报错:
tperror=11
察看日志说:ora-01403错误
请问,我的C程序有什么问题,只就C程序而言,有无语法错误?或者哪里有明显的错误

[ 本帖最后由 simhare 于 2009-7-3 09:13 编辑 ]

最佳答案

查看完整内容

呵呵,我是看你tpcall的两个参数用的都是reqbuf,不知道这样有沒有问题,反正我以前没这么用过

论坛徽章:
2
丑牛
日期:2014-06-11 13:55:04ChinaUnix元老
日期:2015-02-06 15:16:14
2 [报告]
发表于 2009-06-30 11:14 |只看该作者

回复 #5 simhare 的帖子

呵呵,我是看你tpcall的两个参数用的都是reqbuf,不知道这样有沒有问题,反正我以前没这么用过

论坛徽章:
0
3 [报告]
发表于 2009-06-30 11:16 |只看该作者

论坛徽章:
2
丑牛
日期:2014-06-11 13:55:04ChinaUnix元老
日期:2015-02-06 15:16:14
4 [报告]
发表于 2009-06-30 12:31 |只看该作者
1403应该是no data

表里有数据?

另外,建议请求buffer和接受buffer分开

论坛徽章:
0
5 [报告]
发表于 2009-06-30 14:35 |只看该作者

回复 #3 山野村夫 的帖子

感谢回复:
----------
表里确实有数据。
建议请求buffer和接受buffer分开-----是什么意思?

论坛徽章:
0
6 [报告]
发表于 2009-06-30 14:38 |只看该作者

回复 #3 山野村夫 的帖子

@山野村夫,
-----------------------------
嗯,我的问题倒是解决了,原因是
不应该用long al_empno=0;
应该用char *al_empno;
-----------------------------
不过,您如果能告诉我如何"请求buffer和接受buffer分开",这个帖子的分数我仍然送给您,呵呵!

[ 本帖最后由 simhare 于 2009-7-3 09:04 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-07-01 11:27 |只看该作者
这个问题只有
long reqlen=1024;
        char *reqbuf;
这有问题,我也没听说过请求buffer和接受buffer分开
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP