前段时间在将原先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; 字串6 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(); 字串8 exit( -1 ); } printf( "i=[%d]\n", aaa.i ); printf( "s=[%s]\n", aaa.s ); printf( "d=[%.2lf]\n", aaa.d ); CloseDB(); } 字串7
其中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; 字串1
再次编译,问题出现了! 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; 字串8 字串1
然后重新编译,一切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; 字串8
修改程序中对结构的引用
EXEC SQL BEGIN DECLARE SECTION; AAA aaa; EXEC SQL END DECLARE SECTION; 字串5
然后重新编译程序,一切正常。
由以上测试可知,在Sybase ESQL/C Precompiler/11.1 for UnixWare(EBF9076)环境下,使用结构的形式操作数据表存在问题。变通的方法是将struct作为自定义的数据类型(typedef)。
鉴于sybase已经于2003年停止了对unixware下版本的支持,建议大家还是尽量避免继续在sco平台(openserver、unixware)下进行sybase的开发!
注:本站资源收集均来子互联网,如有侵权请告知,我们将第一时间删除.
|