DB2 十进制字段从 OLEDB 返回为负DBTYPE_NUMERIC

DB2 decimal fields come back as negative DBTYPE_NUMERIC from OLEDB

本文关键字:DBTYPE NUMERIC 返回 十进制 字段 OLEDB DB2      更新时间:2023-10-16

使用 OLEDB 从 C++ 我从 DB2 获取十进制字段的DBTYPE_NUMERIC,并像这样转换为 DECIMAL (省略错误检查):

...
CDynamicAccessor* pAccessor = GetAccessor();
...
DBTYPE dbT=0;
pAccessor->GetColumnType(nIndex, &dbT);
if (dbT == DBTYPE_NUMERIC)
{
DB_NUMERIC* pNum = (DB_NUMERIC*)pAccessor->GetValue(nIndex);
DECIMAL dec;
DECIMAL_SETZERO(dec);
dec.sign = pNum->sign; // <--this comes back as 1 for positive fields and 0 for negative
dec.scale = pNum->scale;
memcpy(&dec.Hi32, pNum->val + 8, 4);
memcpy(&dec.Lo64, pNum->val, 8);
....
}

我不明白的是为什么 DB_NUMERIC::sign 在 DB2 中返回为 1 表示正小数字段,而 0 表示负数。这是正确的行为吗?根据这里的定义,十进制正好相反 - 0 应该是正数。 是数据库/字段设置吗?在数据库中,一切看起来都是积极的。如果我将 db 中的值设置为负值,它会返回正值。因此,在返回的DB_NUMERIC结构中,正数的符号打开,负数的符号关闭。这与预期的相反/相反。怎么了? 顺便说一句:我在任何地方都找不到任何关于 oledb.h DB_NUMERIC的文档。 请帮忙。提前非常感谢!

在 MSDN 中找到了一个晦涩难懂的文档,该文档确认 DB_NUMERIC 和 DECIMAL 几乎以相反的方式处理符号。