免费注册 查看新帖 |

Chinaunix

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

菜鸟再问Pro*C问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-02-21 15:54 |只看该作者 |倒序浏览
#include <stdlib.h>;
#include <stdio.h>;

struct myStruct
{        char *Data;
        int score;
        struct myStruct *Next;
};

struct myStruct  *Prn()
{
        struct myStruct *myNode,*List,*PNode;
        char *iA;
        int i,iScore;
        List=NULL;        PNode=NULL;       
        for (i=0;i<10;i++)
        {
                iScore=i+3;
                if ((iScore%2)==0) iA="HHH";
                else iA="WWW";
                myNode=(struct myStruct *)malloc(sizeof(struct myStruct));
                myNode->;Data=iA;
                myNode->;score=iScore;
                myNode->;Next=NULL;
                if (List!=NULL) List->;Next=myNode;
                List=myNode;
                if  (PNode==NULL) PNode=List;
               
                printf("\n";
                printf("%s \t %d",List->;Data,List->;score);
               
        }
        printf("\n";
        return PNode;
};

void main()
{        struct myStruct *PN;
        PN=Prn();
        while (PN!=NULL)
        {        printf("\n %s \t %d",PN->;Data,PN->;score);
                PN=PN->;Next;
         }
        getch();
};

上面代码输出结果如我所愿,但下面的Pro*C代码的输出结果非我所愿:

#include <stdlib.h>;
#include <stdio.h>;
#include "e:\oracle\ora81\precomp\public\sqlca.h"

struct RoadInfo
{
        int RoadNo;
        char *RoadName;
        struct RoadInfo *Next;
};

void error_proc();

void ConnectDB(char *uname,char *dname)
{  EXEC SQL CONNECT :uname USING :dname;}

void DisconnectDB()
{  EXEC SQL COMMIT WORK RELEASE;}


struct RoadInfo *RoadList()
{
char uname[] = "westnetwork/westnetwork";
char dname[] = "YX";

EXEC SQL BEGIN DECLARE SECTION;
struct RoadInfo *RNode,*RList,*PR;
char RoadName[20];
int RoadNo;
EXEC SQL END DECLARE SECTION;

RList=NULL; PR=NULL;
//异常
EXEC SQL WHENEVER SQLERROR DO error_proc();
//连接
ConnectDB(uname,dname);

EXEC SQL DECLARE c1 CURSOR FOR
SELECT DISTINCT ROADNO,ROADNAME FROM ROAD;

EXEC SQL OPEN c1;

do
{
    EXEC SQL FETCH c1 INTO :RoadNo,:RoadName;
    if (sqlca.sqlcode==1403) break;
    RNode=(struct RoadInfo *)malloc(sizeof(struct RoadInfo));
    RNode->;RoadNo=RoadNo;
    RNode->;RoadName=RoadName;
    RNode->;Next=NULL;
    if (RList!=NULL) RList->;Next=RNode;
    RList=RNode;
    if (PR==NULL) PR=RList;            
    printf("\n 路段编码:%-20d 路段名称: %-20s\n",RList->;RoadNo,RList->;RoadName);
}while (1);

EXEC SQL CLOSE c1;

printf("\n\n按任意键继续";
getch();

//提交并释放连接
DisconnectDB();
return PR;
}

void main()
{
        struct RoadInfo *PRd;
        PRd=RoadList();
        while (PRd!=NULL)
        {       
                printf("\n";
                printf("%d",PRd->;RoadNo);
                printf("\t";
                printf("%s",PRd->;RoadName);
                PRd=PRd->;Next;
        }
}

void error_proc()
{
printf("\n%.*s!",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
exit(-1);
}

在main中printf("%s",PRd->;RoadName)输出的结果(非我所愿)与RoadList函数中输出的RList->;RoadName的值不符。怎么回事?

论坛徽章:
0
2 [报告]
发表于 2003-02-21 16:03 |只看该作者

菜鸟再问Pro*C问题

EXEC SQL FETCH c1 INTO :RoadNo,:RoadName;    //保存查询结果而此时RoadNo还没有分配
if (sqlca.sqlcode==1403) break;
RNode=(struct RoadInfo *)malloc(sizeof(struct RoadInfo));

论坛徽章:
0
3 [报告]
发表于 2003-02-21 16:10 |只看该作者

菜鸟再问Pro*C问题

EXEC SQL FETCH c1 INTO :RoadNo,:RoadName; //保存查询结果而此时RoadNo还没有分配
------------------------------------------------------
RoadList函数已定义RoadNo,RoadName变量,不是结构的数据域RoadNo,RoadName。再看看。

论坛徽章:
0
4 [报告]
发表于 2003-02-21 16:11 |只看该作者

菜鸟再问Pro*C问题

原帖由 "steel1991" 发表:

RNode->;RoadName=RoadName

没太仔细看,但是我看到的这个赋值语句是有问题的。
作为char*,应该用memcpy或者strcpy。
只有在EXEC SQL段里面才可以直接用"="赋值。

论坛徽章:
0
5 [报告]
发表于 2003-02-21 16:12 |只看该作者

菜鸟再问Pro*C问题

struct RoadInfo *RNode,*RList,*PR;

这里定义
但是后面没有分配内存

论坛徽章:
0
6 [报告]
发表于 2003-02-21 16:13 |只看该作者

菜鸟再问Pro*C问题

无双说的也对,而且在你的RNode结构里面,RoadName也没有分配空间。我想他应该是这个意思。

论坛徽章:
0
7 [报告]
发表于 2003-02-21 16:27 |只看该作者

菜鸟再问Pro*C问题

不错

论坛徽章:
0
8 [报告]
发表于 2003-02-21 16:33 |只看该作者

菜鸟再问Pro*C问题

EXEC SQL BEGIN DECLARE SECTION;
struct RoadInfo *RNode,*RList,*PR;
char RoadName[20];
int RoadNo;
EXEC SQL END DECLARE SECTION;

上面代码声明了
char RoadName[20];
int RoadNo;

RoadList函数的输出结果是对的。
RNode=(struct RoadInfo *)malloc(sizeof(struct RoadInfo));//申请结点空间
RoadList函数返回链表,参照第一段非Pro*C代码,我觉得应没问题的,其实在Main与RoadList函数中输出结点的RoadNo数据都正确了,只是不明白结点的RoadName的值为何不一致。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP