- 论坛徽章:
- 0
|
前段时间在将原先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的开发! |
|