免费注册 查看新帖 |

Chinaunix

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

Sybase ESQL/C Precompiler/11.1 for UnixWare存在的BUG [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-17 11:52 |只看该作者 |倒序浏览
前段时间在将原先linux环境下的程序移到unixware下时发现了一些问题,主要是涉及操作数据库时直接将表中的一条记录select到与之对应的结构中时预编译器报错。下面是用于测试的程序和现象。

测试程序:
aaa.cp


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

  3. EXEC SQL include sqlca;

  4. long SQLCODE;

  5. EXEC SQL WHENEVER SQLERROR CONTINUE;
  6. EXEC SQL WHENEVER SQLWARNING CONTINUE;
  7. EXEC SQL WHENEVER NOT FOUND CONTINUE;

  8. #ifndef SQLMESSAGE
  9. #define SQLMESSAGE  sqlca.sqlerrm.sqlerrmc
  10. #endif

  11. EXEC SQL BEGIN DECLARE SECTION;
  12. struct aaa {
  13.     int i;
  14.     char s[5];
  15.     double d;
  16. };
  17. EXEC SQL END DECLARE SECTION;

  18. main()
  19. {
  20. EXEC SQL BEGIN DECLARE SECTION;
  21.     struct aaa aaa;
  22. EXEC SQL END DECLARE SECTION;

  23.     if( ConnectDB( "sa", "", NULL ) < 0 )
  24.     {
  25.         printf( "connect DB error!\n" );
  26.         exit( -1 );
  27.     }

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

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

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

  39.     CloseDB();
  40. }
复制代码


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

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

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

  1. EXEC SQL BEGIN DECLARE SECTION;

  2. struct aaa {
  3.     int i;
  4.     char s[5];
  5.     double d;
  6. };

  7. struct bbb{
  8.     int a;
  9.     char b[5];
  10.     char c[30];
  11.     double d;
  12. };

  13. 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

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

  1. EXEC SQL BEGIN DECLARE SECTION;

  2. struct bbb{
  3.     int a;
  4.     char b[5];
  5.     char c[30];
  6.     double d;
  7. };

  8. struct aaa {
  9.     int i;
  10.     char s[5];
  11.     double d;
  12. };

  13. EXEC SQL END DECLARE SECTION;
复制代码

然后重新编译,一切OK!

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

换一种定义方法:

  1. EXEC SQL BEGIN DECLARE SECTION;

  2. typedef struct aaa {
  3.     int i;
  4.     char s[5];
  5.     double d;
  6. } AAA;

  7. typedef struct bbb{
  8.     int a;
  9.     char b[5];
  10.     char c[30];
  11.     double d;
  12. } BBB;

  13. EXEC SQL END DECLARE SECTION;
复制代码


修改程序中对结构的引用

  1. EXEC SQL BEGIN DECLARE SECTION;
  2.     AAA aaa;
  3. EXEC SQL END DECLARE SECTION;
复制代码


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


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

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

论坛徽章:
0
2 [报告]
发表于 2005-08-19 00:48 |只看该作者

Sybase ESQL/C Precompiler/11.1 for UnixWare存在的BUG

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

论坛徽章:
0
3 [报告]
发表于 2005-08-19 10:09 |只看该作者

Sybase ESQL/C Precompiler/11.1 for UnixWare存在的BUG

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


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

论坛徽章:
0
4 [报告]
发表于 2005-10-10 09:49 |只看该作者

Sybase ESQL/C Precompiler/11.1 for UnixWare存在的BUG

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

论坛徽章:
0
5 [报告]
发表于 2005-10-10 11:38 |只看该作者

Sybase ESQL/C Precompiler/11.1 for UnixWare存在的BUG

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


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

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
6 [报告]
发表于 2005-10-10 13:08 |只看该作者

Sybase ESQL/C Precompiler/11.1 for UnixWare存在的BUG

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

论坛徽章:
0
7 [报告]
发表于 2006-09-03 15:02 |只看该作者
请问Sybase的存储过程中如何连接外部数据库?如MySQL.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP