_variant_t和_bstr_t

Posted Good Good Study~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了_variant_t和_bstr_t相关的知识,希望对你有一定的参考价值。

_variant_t和_bstr_t这两个类分别封装并管理VARIANT和BSTR这两种数据类型,

VARIANT和BSTR这两种类型是COM中使用的数据类型。

 

实现_variant_t向int,String ,double,long,byte等类型转换

 

为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。
通过_variant_t和_bstr_t这两个类,就可

_variant_t var;
var=m_pRecordset->GetCollect ("UserName");
ss=(TCHAR*)(_bstr_t)vUsername;//转换成字符串

 

以方便的把C++类型变量转换成COM中的变量了。

 

CString转换为_variant_t:

CString str = _T("xxx");
_variant_t var = (LPCTSTR)str;

把CString 转换为_variant_t:

整型:(long) (_variant_t) m_pRecordset->GetFieldByName("XX");
字符串型:(m_pRecordset->GetFieldByName("XX")).bstrVal;

把一个日期字符串转成_variant_t:

1.CString可以直接转_variant_t。 
CString szTime("2008-8-8 08:08:08");
_variant_t  mt = szTime;
2._variant_t转CString用如下函数:
CString VariantToCString(_variant_t var)
{
    
    CString str; //转换以后的字符串
    
    switch(var.vt)
        
    {
case VT_BSTR: //var is BSTR type
        
        str=var.bstrVal;
        
        break;
case VT_I2: //var is short int type
        
        str.Format("%d",(int)var.iVal);
        
        break;
case VT_I4: //var is long int type
        
        str.Format("%d",var.lVal);
        
        break;
case VT_R4: //var is float type
        
        str.Format(".6f",(double)var.fltVal);
        
        break;
case VT_R8: //var is double type
        
        str.Format(".6f",var.dblVal);
        
        break;
case VT_CY: //var is CY type
        
        str=COleCurrency(var).Format();
        
        break;
case VT_DATE: //var is DATE type
        
        str=COleDateTime(var).Format();
        
        break;
case VT_BOOL: //var is VARIANT_BOOL
        
        str= (var.boolVal==0) ?L"FALSE": L"TRUE";
        
        break;
default:
        
        str.Format("Unk type %d\\n",var.vt);
        
        TRACE("Unknown type %d\\n",var.vt);
        
    }
    
    return str;
    
}

把一个int转换为_variant_t类型:

int a = 5;
 _variant_t var;
 
 var = (_variant_t)(long)a;

 

 


 

 

     UpdateData();
        CString strCmd = L"select * from n where 材料=\'";
        strCmd += m_Querymaterial;
        strCmd += "\'";
        m_pRecordset = m_pConnection->Execute(_bstr_t(strCmd), &RecordsAffected, adCmdText);

 

 

 

_variant_t vM,vN;
    try
    {
        while(!m_pRecordset->adoEOF)
        {
            //取得第0列的值,从0开始计数
            vM=m_pRecordset->GetCollect(_variant_t((long)0));
            //取得“折射率”这一列的值
            vN=m_pRecordset->GetCollect("折射率");
            CString strtemp;
            if (vM.vt!=VT_NULL)  
            {  
                strtemp.Format(_T("%s"),vM.lVal);  
            }
            if (vN.vt!=VT_NULL)
            {
                strtemp+=" ";
                strtemp+=(LPCTSTR)(_bstr_t)vN;
            }
            m_list1.AddString(strtemp);  
            m_list1.AddString(_T("\\n"));
            m_pRecordset->MoveNext();//移动到下一条记录
        }
    }
    catch(_com_error &e)  
    {  
        AfxMessageBox(e.Description());
        return;
    }  
    if (m_pRecordset->Close())
    {
        m_pRecordset->Close();
        m_pRecordset=NULL;
    } 
    if (m_pConnection->State)
    {
        m_pConnection->Close();
        m_pConnection=NULL;
    }
}

 

以上是关于_variant_t和_bstr_t的主要内容,如果未能解决你的问题,请参考以下文章

CComVariant 与 _variant_t、CComBSTR 与 _bstr_t

_variant_t的使用

关于使用_bstr_t的一个坑

C++ 和 .NET - 从 'System::String ^' 转换为 '_variant_t'

如何将_bstr_t转换为CString

释放从 char* 创建的 _bstr_t