ESQL编程用SQLDA时取char类型字段少一位

Andy84920 2010-01-28 12:17:17
数据库是sybase 12.5的。

用ESQL使用SQLDA来动态取列数据时,如果该列是char(4)或者varchar(4)类型的时候,则只能取出前三位字符,请问这是什么原因呢?
...全文
80 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cattycat 2010-01-28
  • 打赏
  • 举报
回复
那还要看你存储的实际长度是什么。如果char(4)实际上3个字节,到c里就是3个字节,varchar是如果小于4则是实际长度。
lovesi3344 2010-01-28
  • 打赏
  • 举报
回复

友情帮顶

数据库不懂
guoyu_bo 2010-01-28
  • 打赏
  • 举报
回复
varchar是sql里的数据类型 怎么发到这里了
z569362161 2010-01-28
  • 打赏
  • 举报
回复
在C里char(4)是3个字符。最后是‘\0’
z569362161 2010-01-28
  • 打赏
  • 举报
回复
举个例子啊?
Andy84920 2010-01-28
  • 打赏
  • 举报
回复
我的意思就是char(4)或者varchar(4)类型的列,实际上的数据是4位的话只能取前三位,第四位就变成'\0'了,当然如果数据只有三位的话就是正确的,但如果数据确实是四位我不可能把数据库设计成都加一位的长度啊,我想还是应该从程序上入手。

下面这段就是取列值的函数:

char * readCol (SQLDA *sqldaPointer, short sd_columnIndex, char * buffer){
short numBytes;
short idx, ind ; /* Array idx variables */
/* Variables for decoding packed decimal data */
char tmpstr[1024];
short collen;
char *dataptr;
/* 检查是否为NULL */
if ( sqldaPointer->sd_column[sd_columnIndex].sd_sqlind == -1)
{ buffer[0] = 0;
return buffer;
}
/*返回列数据到buffer变量*/
memcpy( buffer, (char *) sqldaPointer->sd_column[sd_columnIndex ].sd_sqldata, sqldaPointer->sd_column[sd_columnIndex ].sd_sqllen);
return buffer;
}


比如:sqldaPointer->sd_column[sd_columnIndex ].sd_sqllen是8位,那

sqldaPointer->sd_column[sd_columnIndex ].sd_sqldata[7]就是'\0',但数据库中确定有8位长度的数据,我测试的是一个char(8)类型的代表8位日期的一个列。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧