首页 > 学技术 > 技术网文 > Sybase > 正文

[精华] Sybase ESQL/C Precompiler/11.1 for UnixWare存在的BUG


来源 chinaunix.net 酷勤网整理

前段时间在将原先linux环境下的程序移到unixware下时发现了一些问题,主要是涉及操作数据库时直接将表中的一条记录select到与之对应的结构中时预编译器报错。下面是用于测试的程序和现象。

测试程序:
aaa.cp


#include <sybfront.h>;
#include <sybdb.h>;

EXEC SQL include sqlca;

long SQLCODE;

EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL WHENEVER SQLWARNING CONTINUE;
EXEC SQL WHENEVER NOT FOUND CONTINUE;

#ifndef SQLMESSAGE
#define SQLMESSAGE  sqlca.sqlerrm.sqlerrmc
#endif

EXEC SQL BEGIN DECLARE SECTION;
struct aaa {
    int i;
    char s[5];
    double d;
};
EXEC SQL END DECLARE SECTION;

main()
{
EXEC SQL BEGIN DECLARE SECTION;
    struct aaa aaa;
EXEC SQL END DECLARE SECTION;

    if( ConnectDB( "sa", "", NULL ) < 0 )
    {
        printf( "connect DB error!\n" );
        exit( -1 );
    }

    memset( &aaa, 0, sizeof(aaa) );

    EXEC SQL select * into :aaa from aaa;
    if( SQLCODE != 0 )
    {
        printf( "select error! SQLCODE[%d] %s\n", SQLCODE, SQLMESSAGE );
        CloseDB();
        exit( -1 );
    }

    printf( "i=[%d]\n", aaa.i );
    printf( "s=[%s]\n", aaa.s );
    printf( "d=[%.2lf]\n", aaa.d );

    CloseDB();
}


其中ConnectDB()、CloseDB()是外部自定义的函数。

对以上代码编译、执行,无任何问题。

下面是使用多个结构的情况,对结构定义部分进行了修改,增加了一个新的结构定义。其它代码未动

EXEC SQL BEGIN DECLARE SECTION;

struct aaa {
    int i;
    char s[5];
    double d;
};

struct bbb{
    int a;
    char b[5];
    char c[30];
    double d;
};

EXEC SQL END DECLARE SECTION;


再次编译,问题出现了!
cc -c -g  -I/home/sybase/include aaa.c
UX:acomp: WARNING: "aaa.cp", line 68: improper member use: a
UX:acomp: WARNING: "aaa.cp", line 68: improper member use: b
UX:acomp: WARNING: "aaa.cp", line 68: improper member use: c

将两个结构定义更换位置:

EXEC SQL BEGIN DECLARE SECTION;

struct bbb{
    int a;
    char b[5];
    char c[30];
    double d;
};

struct aaa {
    int i;
    char s[5];
    double d;
};

EXEC SQL END DECLARE SECTION;

然后重新编译,一切OK!

可见在使用struct时,cpre用到的是在“EXEC SQL END DECLARE SECTION”语句之前的最后定义的结构。

换一种定义方法:

EXEC SQL BEGIN DECLARE SECTION;

typedef struct aaa {
    int i;
    char s[5];
    double d;
} AAA;

typedef struct bbb{
    int a;
    char b[5];
    char c[30];
    double d;
} BBB;

EXEC SQL END DECLARE SECTION;


修改程序中对结构的引用

EXEC SQL BEGIN DECLARE SECTION;
    AAA aaa;
EXEC SQL END DECLARE SECTION;


然后重新编译程序,一切正常。


由以上测试可知,在Sybase ESQL/C Precompiler/11.1 for UnixWare(EBF9076)环境下,使用结构的形式操作数据表存在问题。变通的方法是将struct作为自定义的数据类型(typedef)。

鉴于sybase已经于2003年停止了对unixware下版本的支持,建议大家还是尽量避免继续在sco平台(openserver、unixware)下进行sybase的开发!



 hannibal 回复于:2005-08-19 00:48:59

编译器报warning应该不影响使用的吧?
c语言的warning级别都是可以调整的,需要的话任何warning都可以不显示.


 sunlan 回复于:2005-08-19 10:09:28

引用:原帖由 "hannibal" 发表:
编译器报warning应该不影响使用的吧?
c语言的warning级别都是可以调整的,需要的话任何warning都可以不显示.



如果两个结构的元素个数和类型完全不一样,那在程序运行的时候会发生什么样的情况?


 mzd73 回复于:2005-10-10 09:49:46

是呀,可是大额支付还在用sybase和unixware,马上就是小额!!!痛苦。。


 sunlan 回复于:2005-10-10 11:38:42

引用:原帖由 "mzd73"]是呀,可是大额支付还在用sybase和unixware,马上就是小额!!!痛苦。。
 发表:



小额用的操作系统和数据库环境是什么?还是和大额共用一套系统吗?


 chuxu 回复于:2005-10-10 13:08:49

好像是有这个问题,改改结构的定义吧


 水若寒 回复于:2006-09-03 15:02:40

请问Sybase的存储过程中如何连接外部数据库?如MySQL.




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=595164
转载请注明作者名及原文出处



收藏本页到: