我用ado方式对数据库操作,读取的时候我查资料是用_variant_t类型接收,然后通过_bstr_t来进行类型转换,可是转换为CString类型之后后面都要多很多空格,虽然可以通过自己写个函数去掉,但还是想问问各位这个具体原因是什么,希望大神给予解答,谢谢

解决方案 »

  1.   


    /*########################################################################
      ------------------------------------------------
        数值类型转换
      ------------------------------------------------
      ########################################################################*/
    COleDateTime vartodate(const _variant_t& var)
    {
    COleDateTime value;
    switch (var.vt) 
    {
    case VT_DATE:
    {
    value = var.date;
    }
    break;
    case VT_EMPTY:
    case VT_NULL:
    value.SetStatus(COleDateTime::null);
    break;
    default:
    value.SetStatus(COleDateTime::null);
    TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
    }
    return value;
    }COleCurrency vartocy(const _variant_t& var)
    {
    COleCurrency value;
    switch (var.vt) 
    {
    case VT_CY:
    value = (CURRENCY)var.cyVal;
    break;
    case VT_EMPTY:
    case VT_NULL:
    value.m_status = COleCurrency::null;
    break;
    default:
    value.m_status = COleCurrency::null;
    TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
    }
    return value;
    }bool vartobool(const _variant_t& var)
    {
    bool value = false;
    switch (var.vt)
    {
    case VT_BOOL:
    value = var.boolVal ? true : false;
    case VT_EMPTY:
    case VT_NULL:
    break;
    default:
    TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
    }
    return value;
    }BYTE vartoby(const _variant_t& var)
    {
    BYTE value = 0;
    switch (var.vt)
    {
    case VT_I1:
    case VT_UI1:
    value = var.bVal;
    break;
    case VT_NULL:
    case VT_EMPTY:
    value = 0;
    break;
    default:
    TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
    }
    return value;
    }short vartoi(const _variant_t& var)
    {
    short value = 0;
    switch (var.vt)
    {
    case VT_BOOL:
    value = var.boolVal;
    break;
    case VT_UI1:
    case VT_I1:
    value = var.bVal;
    break;
    case VT_I2:
    case VT_UI2:
    value = var.iVal;
    break;
    case VT_NULL:
    case VT_EMPTY:
    value = 0;
    break;
    default:
    TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
    }
    return value;
    }long vartol(const _variant_t& var)
    {
    long value = 0;
    switch (var.vt)
    {
    case VT_BOOL:
    value = var.boolVal;
    break;
    case VT_UI1:
    case VT_I1:
    value = var.bVal;
    break;
    case VT_UI2:
    case VT_I2:
    value = var.iVal;
    break;
    case VT_I4:
    case VT_UI4:
    value = var.lVal;
    break;
    case VT_INT:
    value = var.intVal;
    break;
    case VT_R4:
    value = (long)(var.fltVal + 0.5);
    break;
    case VT_R8:
    value = (long)(var.dblVal + 0.5);
    break;
    case VT_DECIMAL:
    value = (long)var;
    break;
    case VT_CY:
    value = (long)var;
    break;
    case VT_BSTR://字符串
    case VT_LPSTR://字符串
    case VT_LPWSTR://字符串
    value = atol((LPCTSTR)(_bstr_t)var);
    break;
    case VT_NULL:
    case VT_EMPTY:
    value = 0;
    break;
    default:
    TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
    }
    return value;
    }double vartof(const _variant_t& var)
    {
    double value = 0;
    switch (var.vt)
    {
    case VT_R4:
    value = var.fltVal;
    break;
    case VT_R8:
    value = var.dblVal;
    break;
    case VT_DECIMAL:
    value = (double)var;
    break;
    case VT_CY:
    value = (double)var;
    break;
    case VT_BOOL:
    value = var.boolVal;
    break;
    case VT_UI1:
    case VT_I1:
    value = var.bVal;
    break;
    case VT_UI2:
    case VT_I2:
    value = var.iVal;
    break;
    case VT_UI4:
    case VT_I4:
    value = var.lVal;
    break;
    case VT_INT:
    value = var.intVal;
    break;
    case VT_BSTR://字符串
    case VT_LPSTR://字符串
    case VT_LPWSTR://字符串
    value = atof((LPCTSTR)(_bstr_t)var);
    break;
    case VT_NULL:
    case VT_EMPTY:
    value = 0;
    break;
    default:
    value = 0;
    TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
    }
    return value;
    }CString vartostr(const _variant_t &var)
    {
    CString strValue;

    switch (var.vt)
    {
    case VT_BSTR://字符串
    case VT_LPSTR://字符串
    case VT_LPWSTR://字符串
    strValue = (LPCTSTR)(_bstr_t)var;
    break;
    case VT_I1:
    case VT_UI1:
    strValue.Format("%d", var.bVal);
    break;
    case VT_I2://短整型
    strValue.Format("%d", var.iVal);
    break;
    case VT_UI2://无符号短整型
    strValue.Format("%d", var.uiVal);
    break;
    case VT_INT://整型
    strValue.Format("%d", var.intVal);
    break;
    case VT_I4: //整型
    strValue.Format("%d", var.lVal);
    break;
    case VT_I8: //长整型
    strValue.Format("%d", var.lVal);
    break;
    case VT_UINT://无符号整型
    strValue.Format("%d", var.uintVal);
    break;
    case VT_UI4: //无符号整型
    strValue.Format("%d", var.ulVal);
    break;
    case VT_UI8: //无符号长整型
    strValue.Format("%d", var.ulVal);
    break;
    case VT_VOID:
    strValue.Format("%8x", var.byref);
    break;
    case VT_R4://浮点型
    strValue.Format("%.4f", var.fltVal);
    break;
    case VT_R8://双精度型
    strValue.Format("%.8f", var.dblVal);
    break;
    case VT_DECIMAL: //小数
    strValue.Format("%.8f", (double)var);
    break;
    case VT_CY:
    {
    COleCurrency cy = var.cyVal;
    //strValue = cy.Format();
    strValue = cy.Format(0, MAKELCID(MAKELANGID(LANG_CHINESE,
    SUBLANG_CHINESE_SINGAPORE), SORT_DEFAULT));
    }
    break;
    case VT_BLOB:
    case VT_BLOB_OBJECT:
    case 0x2011:
    strValue = "[BLOB]";
    break;
    case VT_BOOL://布尔型 strValue = var.boolVal ? "TRUE" : "FALSE";
    break;
    case VT_DATE: //日期型
    {
    DATE dt = var.date;
    COleDateTime da = COleDateTime(dt); 
    strValue = da.Format("%Y-%m-%d %H:%M:%S");
    }
    break;
    case VT_NULL://NULL值
    strValue = "";
    break;
    case VT_EMPTY://空
    strValue = "";
    break;
    case VT_UNKNOWN://未知类型
    default:
    strValue = "UN_KNOW";
    break;
    }
    return strValue;
    }求给分...
      

  2.   

    楼上很强。。空格可以用Replace替换掉!
      

  3.   


     strValue = (LPCTSTR)(_bstr_t)var;我就是用这个转换的,转换后有空格
    可是我看了数据库里面,各个值没有加那么多空格啊
      

  4.   

    你没看到上面代码很多类型转换?这涉及的东西就多了.比如多字符集就占2个字节....
    我是没心情研究那些东西),_bstr_t 可以说是万能类型....看看他的定义类型...
      

  5.   


    vs2008可以直接使用
    cstring cs=rs.getcolect(...)