[普通]c++访问sql数据库获取__int64值(负数)

作者(passion) 阅读(1130次) 评论(0) 分类( c++)



先上代码,代码最明确,解决获取负数为0的问题。

LONGLONG GetValue_LONGLONG( LPCTSTR pszItem ){
        _variant_t VarValue;
        GetValue_VarValue(pszItem,VarValue);
        if( VT_DECIMAL == VarValue.vt )   
        {   
                DECIMAL decVal = VarValue.decVal;
                //判断正数负数
                int nSign = 1;
                //根据符号位判断符号
                if ( decVal.sign < 128 ) nSign = 1;
                if ( decVal.sign >= 128 )nSign = -1;
                __int64 nReturnVal = decVal.Lo64;  
                return nReturnVal*nSign;
        }
        return VarValue.llVal;}
//获取参数bool GetFieldValue(LPCTSTR lpFieldName, __int64 & llValue){
    try
    {
        llValue=0L;
        _variant_t vtFld=m_DBRecordset->Fields->GetItem(lpFieldName)->Value;
        if ((vtFld.vt!=VT_NULL)&&(vtFld.vt!=VT_EMPTY)) llValue=vtFld.llVal;
        return true;
    }
    catch (CComError & ComError) { SetErrorInfo(ErrorType_Other,GetComErrorDescribe(ComError)); }
  
    return false;}


经过调试后发现,只要获取的那个数是负数的时候,llVal压根就没变,一直为0,后来谷歌了两下,才发现了源头


基本数据用到的是

1) Lo64,这个是存放实际数据的,64bit

2) sign: 符号位,如果小于128,则是正数;sign>=128 则值value <0

3) signscale, scale 这是规定了小数点的精度

4) wReversed:这个是数据整体的长度,举例

VT_DECIMAL(16, 3): 则规定了整个数据的长度是16(不包括小数点、符号位),其中3位小数

所以:3.1415926 表示成 (16,3) 精度的表达形式是 3.141, Lo64=3141 sign =3


« 上一篇:城市热点dr.com5.2.0,5.2.1,6.0(D) 校园网客户端破解版(drcom至尊版)
« 下一篇:预编译头错误
在这里写下您精彩的评论
  • 微信

  • QQ

  • 支付宝

返回首页
返回首页 img
返回顶部~
返回顶部 img