先上代码,代码最明确,解决获取负数为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
微信
支付宝