今天心情不好,大家来讨论讨论DB_NUMERIC的用法吧

gancheng 2002-05-02 03:27:32
以前用OLEDB CONSUMER 的时候我一般都是在数据库中使用INT 和 CHAR,映射为C++的数据类型就是 LONG 和 TCHAR 。这些都是我熟悉的数据类型,所以一直没有什么大问题。这次毕业设计,因为是合作开发,在设计的时候考虑到数据表示范围,所以使用了NUMERIC和DECIMAL作为数据库字段类型。没想到烦恼就从这两个数据类型开始了。
追求时髦的缘故吧,我使用VC7.0,因为对VC6.0的熟悉,所以架构设计完成之后我就非常有信心的开始了代码的编写(我负责通过网络采集数据的一个模块)。一切都进展得很顺利,数据非常顺利的采集过来,并且被我解析成对象、以及对象的集合。正当我准备开始编写“数据入库”代码的时候,我才发现VC7.0和VC6.0中的ATL OLEDB CONSUMER大有不同的地方——原来是ATL的版本升级了,没有办法,我只好扎在MSDN中重新学习了一下VC7.0中的ATL的使用方法,写了点学习代码之后我才突然发现,我数据库中使用的NUMERIC和DECIMAL所映射的DB_NUMERIC我从来都没有使用过!查遍了MSDN也只找到DB_NUMERIC的定义tagDB_NUMERIC还有一个莫名其妙的解释


typedef struct tagNUMERIC {
BYTE precision;
BYTE scale;
BYTE sign;
BYTE val[16];
} DB_NUMERIC;

Members
precision
The maximum number of digits in base 10.
scale
The number of digits to the right of the decimal point.
sign
The sign is 1 for positive numbers, and 0 for negative numbers.
val
A number stored as a 16-byte scaled integer, with the least-significant byte on the left.
For example, to specify the base 10 number 20.003 with a scale of 4, the number is scaled to an integer of 200030 (20.003 shifted by four tens digits), which is 186AA in hexadecimal. The value stored in the 16-byte integer is 5E 0D 03 00 00 00 00 00 00 00 00 00 00 00 00 00, the precision is the maximum precision, the scale is 4, and the sign is 1.

大家看好了,从For example这一段仔细看 看到 “which is 186AA..." 我怎么也想不通:200030的16进制不是030d5e吗?(文章中 the value stored in the 16-byte.. 也说明了)怎么会是 186AA (100010 in decimal)呢?
还有就是decimal这么麻烦大家有没有什么好办法?一定要让我自己写类型转换函数吗?查了这儿的历史,去年12月有人问了这个问题,但是没有人回答,希望这次有人能回答了,小弟我谢谢大家了——因为心情实在不好,不想一个人钻牛角尖了。
...全文
185 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gancheng 2002-05-03
  • 打赏
  • 举报
回复
感谢大家的支持和安慰,虽然我没有在msdn中找到直接管理DB_NUMERIC的工具类,但是受到大家的鼓舞,我自己写了一个从DB_NUMERIC派生的类:
class CMDBNumeric :
public DB_NUMERIC
{
public:
CMDBNumeric(void);
CMDBNumeric(unsigned long val);
CMDBNumeric(unsigned int val);
CMDBNumeric(unsigned char val);
CMDBNumeric(long double val);
CMDBNumeric(long val);
CMDBNumeric(int val);
CMDBNumeric(float val);
CMDBNumeric(double val);
CMDBNumeric(char val);
CMDBNumeric(bool val);
~CMDBNumeric(void);
};

#include "basicfluxinfo.h"
CMDBNumeric::CMDBNumeric(void)
{
memset((void *)this,0,sizeof(CMDBNumeric));
}

CMDBNumeric::~CMDBNumeric(void)
{
}

CMDBNumeric::CMDBNumeric(unsigned long val)
{
unsigned long *ptr=(unsigned long *)(this->val);
memset((void *)this,0,sizeof(CMDBNumeric));
this->precision=10;
this->sign=1;
*ptr=val;
}

CMDBNumeric::CMDBNumeric(unsigned int val)
{
unsigned int *ptr=(unsigned int *)(this->val);
memset((void *)this,0,sizeof(CMDBNumeric));
this->precision=10;
this->sign=1;
*ptr=val;
}

CMDBNumeric::CMDBNumeric(unsigned char val)
{
unsigned char *ptr=(unsigned char *)(this->val);
memset((void *)this,0,sizeof(CMDBNumeric));
this->precision=5;
this->sign=1;
*ptr=val;
}

CMDBNumeric::CMDBNumeric(long double val)
{
memset((void *)this,0,sizeof(CMDBNumeric));
//TO BE CONTINUED
}

CMDBNumeric::CMDBNumeric(long val)
{
long *ptr=(long *)(this->val);
memset((void *)this,0,sizeof(CMDBNumeric));
this->precision=10;
if (val>0)
{
this->sign=1;
*ptr=val;
}
else
{
this->sign=0;
*ptr=-val;
}
}

CMDBNumeric::CMDBNumeric(int val)
{
int *ptr=(int *)(this->val);
memset((void *)this,0,sizeof(CMDBNumeric));
this->precision=10;
if (val>0)
{
this->sign=1;
*ptr=val;
}
else
{
this->sign=0;
*ptr=-val;
}
}

CMDBNumeric::CMDBNumeric(float val)
{
memset((void *)this,0,sizeof(CMDBNumeric));
this->precision=10;
//TO BE CONTINUED
}

CMDBNumeric::CMDBNumeric(double val)
{
memset((void *)this,0,sizeof(CMDBNumeric));
this->precision=17;
//TO BE CONTINUED
}

CMDBNumeric::CMDBNumeric(char val)
{
char *ptr=(char *)(this->val);
memset((void *)this,0,sizeof(CMDBNumeric));
this->precision=5;
if (val>0)
{
this->sign=1;
*ptr=val;
}
else
{
this->sign=0;
*ptr=-val;
}
}

CMDBNumeric::CMDBNumeric(bool val)
{
char *ptr=(char *)(this->val);
memset((void *)this,0,sizeof(CMDBNumeric));
this->precision=1;
this->sign=1;
*ptr=val;
}

其中对DOUBLE 和FLOAT的支持还没有写 四则运算的操作符也没有写——因为我现在只需要从整型构建就可以。以后有机会的话我一定会写完的,也欢迎大家跟贴写完整——凡是写完整了的我都给分,不过一定要加上四则运算哦。
Lesily 2002-05-02
  • 打赏
  • 举报
回复
up
10ach 2002-05-02
  • 打赏
  • 举报
回复
"琤"字怎么念?
yyfhz 2002-05-02
  • 打赏
  • 举报
回复
你有试过吗?会不会是Help弄错了?
晨星 2002-05-02
  • 打赏
  • 举报
回复
我跟你一样,心情不好时就到这里来,以前心情不好时就在校园里到处乱逛,时间都浪费了,真得感谢csdn。
帮你up。
quanxiongwei 2002-05-02
  • 打赏
  • 举报
回复
我能做的就是帮你up一下

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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