CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 6 of 6
  1. #1
    Join Date
    May 1999
    Location
    Surrey, England
    Posts
    23

    Recordsets: converting COleVariant

    Hello,

    VC++6.0 Prof, Win98

    I am a new VC++ programmer looking for help.

    I am trying to open a recordset on the fly and read a value from the first record. This apparently
    necessitates using GetFieldValue with a COleVariant variable. My code is as follows:-

    CDaoDatabase* pDB = new CDaoDatabase;
    try
    {
    pDB->Open("D:\\Vb4&5prg\\Experiment\\Mail1.mdb");
    }
    catch(CDaoException* e)
    {
    AfxMessageBox(e->m_pErrorInfo->m_strDescription, MB_ICONEXCLAMATION);
    e->Delete();
    }

    CDaoRecordset pRS(pDB);
    CString mText = "Select * from Folders";
    try
    {
    pRS.Open(AFX_DAO_USE_DEFAULT_TYPE, mText,0);
    }
    catch(CDaoException* e)
    {
    AfxMessageBox(e->m_pErrorInfo->m_strDescription, MB_ICONEXCLAMATION);
    e->Delete();
    }
    pRS.MoveFirst();
    COleVariant mVar;
    int i = 1;
    mVar = pRS.GetFieldValue(i);
    mText = mVar;
    AfxMessageBox(mText);
    pDB->Close();
    delete pDB;



    The above fails on the attempt to pass the COleVariant value into a CString. I would be grateful for code
    examples on how to convert a COleVariant into something that can be readily used, preferably a CString.
    If there are any other errors in my code, I'd also be glad to know.

    Hoping for help from all you experts,

    TrimTrom

    ----------------------------------
    Email: [email protected]
    Surrey, England
    ----------------------------------


  2. #2
    Join Date
    May 1999
    Location
    Seattle, WA USA
    Posts
    423

    Re: Recordsets: converting COleVariant

    I have never done anything like you are doing, but to get a COleVariant into a CString, assuming that it has a valid BSTR in it, all you need to do is:

    CString MyString = MyOleVariant.bstrVal;

    --michael


  3. #3
    Join Date
    Jun 1999
    Posts
    7

    Re: Recordsets: converting COleVariant

    You will need a function, that is not defined in MFC to convert COleVariant to CString.
    This function is defined in the follow lines:

    //This function is necessary to strVARIANT work
    LPCTSTR strBOOL(BOOL bFlag)
    {
    return bFlag ? _T("TRUE") : _T("FALSE");
    }


    //You must insert the prototype in the headers
    CString strVARIANT(const COleVariant& var)
    {
    CString strRet;
    strRet = _T("Fish");
    switch(var.vt){
    case VT_EMPTY:
    case VT_NULL:
    strRet = _T("NULL");
    break;
    case VT_I2:
    strRet.Format(_T("%hd"),V_I2(&var));
    break;
    case VT_I4:
    strRet.Format(_T("%d"),V_I4(&var));
    break;
    case VT_R4:
    strRet.Format(_T("%e"),(double)V_R4(&var));
    break;
    case VT_R8:
    strRet.Format(_T("%e"),V_R8(&var));
    break;
    case VT_CY:
    strRet = COleCurrency(var).Format();
    break;
    case VT_DATE:
    strRet = COleDateTime(var).Format(_T("%m %d %y"));
    break;
    case VT_BSTR:
    strRet = V_BSTRT(&var);
    break;
    case VT_DISPATCH:
    strRet = _T("VT_DISPATCH");
    break;
    case VT_ERROR:
    strRet = _T("VT_ERROR");
    break;
    case VT_BOOL:
    return strBOOL(V_BOOL(&var));
    case VT_VARIANT:
    strRet = _T("VT_VARIANT");
    break;
    case VT_UNKNOWN:
    strRet = _T("VT_UNKNOWN");
    break;
    case VT_I1:
    strRet = _T("VT_I1");
    break;
    case VT_UI1:
    strRet.Format(_T("0x%02hX"),(unsigned short)V_UI1(&var));
    break;
    case VT_UI2:
    strRet = _T("VT_UI2");
    break;
    case VT_UI4:
    strRet = _T("VT_UI4");
    break;
    case VT_I8:
    strRet = _T("VT_I8");
    break;
    case VT_UI8:
    strRet = _T("VT_UI8");
    break;
    case VT_INT:
    strRet = _T("VT_INT");
    break;
    case VT_UINT:
    strRet = _T("VT_UINT");
    break;
    case VT_VOID:
    strRet = _T("VT_VOID");
    break;
    case VT_HRESULT:
    strRet = _T("VT_HRESULT");
    break;
    case VT_PTR:
    strRet = _T("VT_PTR");
    break;
    case VT_SAFEARRAY:
    strRet = _T("VT_SAFEARRAY");
    break;
    case VT_CARRAY:
    strRet = _T("VT_CARRAY");
    break;
    case VT_USERDEFINED:
    strRet = _T("VT_USERDEFINED");
    break;
    case VT_LPSTR:
    strRet = _T("VT_LPSTR");
    break;
    case VT_LPWSTR:
    strRet = _T("VT_LPWSTR");
    break;
    case VT_FILETIME:
    strRet = _T("VT_FILETIME");
    break;
    case VT_BLOB:
    strRet = _T("VT_BLOB");
    break;
    case VT_STREAM:
    strRet = _T("VT_STREAM");
    break;
    case VT_STORAGE:
    strRet = _T("VT_STORAGE");
    break;
    case VT_STREAMED_OBJECT:
    strRet = _T("VT_STREAMED_OBJECT");
    break;
    case VT_STORED_OBJECT:
    strRet = _T("VT_STORED_OBJECT");
    break;
    case VT_BLOB_OBJECT:
    strRet = _T("VT_BLOB_OBJECT");
    break;
    case VT_CF:
    strRet = _T("VT_CF");
    break;
    case VT_CLSID:
    strRet = _T("VT_CLSID");
    break;
    }
    WORD vt = var.vt;
    if(vt & VT_ARRAY){
    vt = vt & ~VT_ARRAY;
    strRet = _T("Array of ");
    }
    if(vt & VT_BYREF){
    vt = vt & ~VT_BYREF;
    strRet += _T("Pointer to ");
    }
    if(vt != var.vt){
    switch(vt){
    case VT_EMPTY:
    strRet += _T("VT_EMPTY");
    break;
    case VT_NULL:
    strRet += _T("VT_NULL");
    break;
    case VT_I2:
    strRet += _T("VT_I2");
    break;
    case VT_I4:
    strRet += _T("VT_I4");
    break;
    case VT_R4:
    strRet += _T("VT_R4");
    break;
    case VT_R8:
    strRet += _T("VT_R8");
    break;
    case VT_CY:
    strRet += _T("VT_CY");
    break;
    case VT_DATE:
    strRet += _T("VT_DATE");
    break;
    case VT_BSTR:
    strRet += _T("VT_BSTR");
    break;
    case VT_DISPATCH:
    strRet += _T("VT_DISPATCH");
    break;
    case VT_ERROR:
    strRet += _T("VT_ERROR");
    break;
    case VT_BOOL:
    strRet += _T("VT_BOOL");
    break;
    case VT_VARIANT:
    strRet += _T("VT_VARIANT");
    break;
    case VT_UNKNOWN:
    strRet += _T("VT_UNKNOWN");
    break;
    case VT_I1:
    strRet += _T("VT_I1");
    break;
    case VT_UI1:
    strRet += _T("VT_UI1");
    break;
    case VT_UI2:
    strRet += _T("VT_UI2");
    break;
    case VT_UI4:
    strRet += _T("VT_UI4");
    break;
    case VT_I8:
    strRet += _T("VT_I8");
    break;
    case VT_UI8:
    strRet += _T("VT_UI8");
    break;
    case VT_INT:
    strRet += _T("VT_INT");
    break;
    case VT_UINT:
    strRet += _T("VT_UINT");
    break;
    case VT_VOID:
    strRet += _T("VT_VOID");
    break;
    case VT_HRESULT:
    strRet += _T("VT_HRESULT");
    break;
    case VT_PTR:
    strRet += _T("VT_PTR");
    break;
    case VT_SAFEARRAY:
    strRet += _T("VT_SAFEARRAY");
    break;
    case VT_CARRAY:
    strRet += _T("VT_CARRAY");
    break;
    case VT_USERDEFINED:
    strRet += _T("VT_USERDEFINED");
    break;
    case VT_LPSTR:
    strRet += _T("VT_LPSTR");
    break;
    case VT_LPWSTR:
    strRet += _T("VT_LPWSTR");
    break;
    case VT_FILETIME:
    strRet += _T("VT_FILETIME");
    break;
    case VT_BLOB:
    strRet += _T("VT_BLOB");
    break;
    case VT_STREAM:
    strRet += _T("VT_STREAM");
    break;
    case VT_STORAGE:
    strRet += _T("VT_STORAGE");
    break;
    case VT_STREAMED_OBJECT:
    strRet += _T("VT_STREAMED_OBJECT");
    break;
    case VT_STORED_OBJECT:
    strRet += _T("VT_STORED_OBJECT");
    break;
    case VT_BLOB_OBJECT:
    strRet += _T("VT_BLOB_OBJECT");
    break;
    case VT_CF:
    strRet += _T("VT_CF");
    break;
    case VT_CLSID:
    strRet += _T("VT_CLSID");
    break;
    }
    }
    return strRet;
    }


    Example:

    CString varstring;
    COleVariant varole;
    varole = tb.GetFieldValue("Field_Name");
    varstring = strVARIANT(varole);


  4. #4
    Join Date
    May 1999
    Location
    Surrey, England
    Posts
    23

    Re: Recordsets: converting COleVariant

    Brilliant - it seems to be a very comprehensive function!

    Thanks,

    TrimTrom

    ----------------------------------
    Email: [email protected]
    Surrey, England
    ----------------------------------


  5. #5
    Join Date
    May 1999
    Posts
    24

    Re: Recordsets: converting COleVariant

    I noticed your post this last Tues, but didn't get a chance to respond. The sample code on your post doesn't include "endcatch" to both "try/catch" exception traps. I made this mistake once, and got an error. Check your actual code and see if you omitted "endcatch".


  6. #6
    Join Date
    Apr 1999
    Location
    Beaverton, OR
    Posts
    241

    Re: Recordsets: converting COleVariant

    This method only works some of the time for me (don't really know why), but I've never had a problem with using the V_BSTRT macro:CString MyString=V_BSTRT(&MyOleVariant);




Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured