小弟编了一个代码:
COleVariant var; // 字段类型
long lID;
CString strIP; 
var.ChangeType(VT_BSTR|VT_BYREF, NULL);
RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM routerlist",NULL);

while(!RecSet.IsEOF()) // 有没有到表结尾
{
RecSet.GetFieldValue("EqiupID",var);
lID = (long)var.pbVal;//此处希望读出一long型量 RecSet.GetFieldValue("IPAddress",var);
strIP = (LPCSTR)var.pbstrVal;//此处希望读出一str类型量
RecSet.MoveNext();
         }
运行时系统报错:类型不匹配
怎么改??

解决方案 »

  1.   

    大概是这一行的问题,可能应该用bstr而不是pbstr
    strIP = (LPCSTR)var.pbstrVal;
    改成
    strIP = var.bstrVal; 试试
      

  2.   

    还有读出long变量时应该用 var.intVal
    int CsRecordSet::GetInteger(LPCTSTR strField)
    {
    CString strValue(_T(""));
    int nValue = 0;
    _variant_t varFieldValue;

    if (m_bValid)
    {
    varFieldValue = m_pRecordset->GetCollect(strField);
    switch(varFieldValue.vt) 
    {
    case VT_NULL:
    break;
    case VT_BSTR:
    strValue = varFieldValue.bstrVal;
    if (strValue != _T(""))
    _stscanf((LPCTSTR)strValue, _T("%d"), &nValue);
    break;
    case VT_I2:
    case VT_I4:
    case VT_INT:
    nValue = varFieldValue.intVal;
    break;
    case VT_UI2:
    case VT_UI4:
    case VT_UINT:
    nValue = (int)varFieldValue.uintVal;
    default:
    break;
    }
    }

    return nValue;
    }CString CsRecordSet::GetString(LPCTSTR strField)
    {
    CString strValue(_T(""));
    _variant_t varFieldValue;

    if (m_bValid)
    {
    try
    {
    varFieldValue = m_pRecordset->GetCollect(strField);
    switch(varFieldValue.vt) 
    {
    case VT_NULL:
    break;
    case VT_BSTR:
    strValue = varFieldValue.bstrVal;
    break;
    case VT_I2:
    case VT_I4:
    case VT_INT:
    strValue.Format(_T("%d"), varFieldValue.intVal);
    break;
    case VT_UI2:
    case VT_UI4:
    case VT_UINT:
    strValue.Format(_T("%u"), varFieldValue.uintVal);
    break;
    default:
    break;
    }
    }
    catch (_com_error)
    {
    }
    } return strValue;
    }