DB2 十进制字段从 OLEDB 返回为负DBTYPE_NUMERIC
DB2 decimal fields come back as negative DBTYPE_NUMERIC from OLEDB
使用 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 几乎以相反的方式处理符号。
相关文章:
- 为什么在main()之前断言会导致语法错误"error: expected ')' before numeric constant"?
- boost::icl::interval 和 boost::numeric::interval 是否有可用的适配层?
- 检测<T>某些非数字类型 T 的 std::numeric::type 的特化
- 是否有内置函数可用于boost :: numeric ::间隔
- 使用 boost::numeric::odeint 积分非线性函数 f'(x, y, z) = a + b*I
- 模板实例化与Armadillo和Boost :: Numeric :: Odeint
- typedef 一个向量和 boost::numeric::ublas::vector 的固定大小
- 为什么Boost Numeric库通过使用调试或发布模式给出不同的结果
- 从另一个子向量或subsatrix创建boost :: numeric :: ublas vector
- 包含 boost::numeric::ublas::matrix 的类的运算符重载
- 与CUDA/OpenMP兼容的`boost::numeric::odeint::runge_kutta-X`模板参数
- 将"using namespace boost::numeric::ublas;"与 stl 矢量一起使用时出错
- BH R封装可以链接以提高"math"和"numeric"吗?
- 你如何让迭代器到一行 boost::numeric::ublas::matrix<T>?
- 在C++中创建一个泛型Numeric类
- 为什么箭头运算符"->"不适用于 boost::numeric::ublas::vector<...>::iterator?
- 编译错误-boost::numeric::ublas::coordinate_matrix
- 如何将boost::numeric::ublas::vector复制到矩阵
- boost::numeric::ublas::矢量内部数据存储指针
- CPPCHECK 查找宏的查找"redundant code: found a statement that begins with numeric constant"