用ADO操作SQL,读取表的数据的时候,int型 的数据总是显示不正确,显示的根本不是数据。我用SQL Server Management Studio查看,数据是正确的。读取字符型的数据时,可以用
_variant_t vName; 
vID=m_pRecordset->GetCollect("Name");
m_Name=(CString)(vName.intVal);读取。其中,m_Name是和一个编辑框关联的 CString类型的变量。但int型的这样读就出错了。请问各路大虾,各种数据读法、转化方法都一样吗?不一样的话分别怎么转化啊?

解决方案 »

  1.   

    先写一个variant转换为string的函数,如下:
    std::string vartostr(const _variant_t &var)
    {
    try
    {
    std::string strValue;
    std::ostringstream os;
    switch (var.vt)
    {
    case VT_BSTR://字符串
    case VT_LPSTR://字符串
    case VT_LPWSTR://字符串
    strValue = (LPCTSTR)(_bstr_t)var;
    break;
    case VT_I1:
    case VT_UI1:
    os.operator <<(var.bVal);
    strValue = os.str();
      break;
    case VT_I2://短整型
    os.operator <<(var.iVal);
    strValue = os.str();
    break;
    case VT_UI2://无符号短整型
    os.operator <<(var.uiVal);
    strValue = os.str();
    break;
    case VT_INT://整型
    os.operator <<(var.intVal);
    strValue = os.str();
    break;
    case VT_I4: //整型
    os.operator <<(var.lVal);
    strValue = os.str();
    break;
    case VT_I8: //长整型
    os.operator <<(var.lVal);
    strValue = os.str();
    break;
    case VT_UINT://无符号整型
    os.operator <<(var.uintVal);
    strValue = os.str();
    break;
    case VT_UI4: //无符号整型
    os.operator <<(var.ulVal);
    strValue = os.str();
    break;
    case VT_UI8: //无符号长整型
    os.operator <<(var.ulVal);
    strValue = os.str();
    break;
    case VT_VOID:
    os.operator <<(var.byref);
    strValue = os.str();
    break;
    case VT_R4://浮点型
    os.operator <<(var.fltVal);
    strValue = os.str();
    break;
    case VT_R8://双精度型
    os.operator <<(var.dblVal);
    strValue = os.str();
    break;
    case VT_DECIMAL: //小数
    os.operator <<((double)var);
    strValue = os.str();
    break;
    case VT_CY:
    strValue = (char* )(_bstr_t)var;
    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: //日期型
    strValue = (char* )(_bstr_t)var;
    break;
    case VT_NULL://NULL值
    strValue = "";
    break;
    case VT_EMPTY://空
    strValue = "";
    break;
    case VT_UNKNOWN://未知类型
    default:
    strValue = "UN_KNOW";
    break;
    }
    return strValue;
    }
    catch (...)
    {
        return "EXCEPTION";
    }
    }然后再根据你的实例代码,可以写成:
    _variant_t vName; 
    vName = m_pRecordset->GetCollect("Name");
    m_Name = vartostr(vName).c_str();