DB2 十进制字段从 OLEDB 返回为负 DBTYPE_NUMERIC
DB2 decimal fields come back as negative DBTYPE_NUMERIC from OLEDB
使用 C++ 中的 OLEDB 我从 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 表示负数。这是正确的行为吗?根据定义 here 它与 DECIMAL 相反 - 0 应该是正数。
是 db/field 设置吗?在数据库中,一切看起来都是积极的。如果我将 db 中的值设置为负值,它会返回正值。因此,符号在返回的 DB_NUMERIC 结构中为正数打开,为负数关闭。这似乎是预期的 reverse/inverse。怎么了?
顺便说一句:我在 oledb.h 中的任何地方都找不到关于 DB_NUMERIC 的任何文档。
请帮忙。非常感谢!
在 MSDN 中找到了一个晦涩的文档,该文档确认 DB_NUMERIC 和 DECIMAL 以几乎相反的方式处理符号。
使用 C++ 中的 OLEDB 我从 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 表示负数。这是正确的行为吗?根据定义 here 它与 DECIMAL 相反 - 0 应该是正数。 是 db/field 设置吗?在数据库中,一切看起来都是积极的。如果我将 db 中的值设置为负值,它会返回正值。因此,符号在返回的 DB_NUMERIC 结构中为正数打开,为负数关闭。这似乎是预期的 reverse/inverse。怎么了? 顺便说一句:我在 oledb.h 中的任何地方都找不到关于 DB_NUMERIC 的任何文档。 请帮忙。非常感谢!
在 MSDN 中找到了一个晦涩的文档,该文档确认 DB_NUMERIC 和 DECIMAL 以几乎相反的方式处理符号。