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