COleVariant类
Posted wjq13752525588
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了COleVariant类相关的知识,希望对你有一定的参考价值。
COleVariant本质上是一个枚举,用同一种类型来表达不同的子类型。如同boost中的variant。
COLeVariant类是对VARIANT结构的封装。
VARIANT结构包含两部分。其一是VARIANT型的成员变量vt;其二是个联合类型,这个联合包含了VC常用的几乎所有类型。因为联合用的是相同的存储空间,因此对联合的内容的解释依赖于vt。
例如:
若vt的值是VT_UI2,说明该联合被解释为short int。并使用成员变量名iVal。
若vt的值是VT_BSTR,说明该联合被解释为BSTR类型。并使用成员变量名bstrVal。
若vt的值是VT_BSTR|VT_BYREF,说明该联合被解释为BSTR型指针。并使用成员变量名pbstrVal。
它的构造函数具有极为强大的功能,当对象构造时首先调用VariantInit进行初始化,然后根据参数中的标准类型调用相应的构造函数,并使用VariantCopy进行转换赋值操作,当VARIANT对象不在有效范围时,它的析构函数就会被自动调用,由于析构函数调用了VariantClear,因而相应的内存就会被自动清除。除此之外,COLeVariant的赋值操作符在与VARIANT类型转换中为我们提供极大的方便。
若从数据库返回的是简单类型,如short,long,等,则直接引用既可。注:COLeVariant类重载了“=”操作符,所以常用的类型可以直接转换, 若返回的是字符串类型,则有可能是bstrVal或pbstrVal。依赖于数据库服务程序。BSTR实际上就是个unicode字符串,CString的构造函数和赋值操作都能直接识别这一类型。
COleVariant功能:
COleVariant类是对VARIANT结构的封装。它的构造函数具有极为强大的功能:
1、当对象构造时首先调用VariantInit进行 初始化,然后根据参数中的标准类型调用相应的构造函数,并使用VariantCopy进行转换赋值操作;
2、当VARIANT对象不在有效范围时,它的析构函 数就会被自动调用,由于析构函数调用了VariantClear,因而相应的内存就会被自动清除。
COleVariant是数据库常用到的数据类型。它可以是字串,整型值,日期等。知道怎样将它转换为CString很有用处。
例如:设有CString A; COleVariant B; 来看看怎样将COleVariant转换为CString:
switch(B.vt){
case VT_BSTR: A=V_BSTRT(&B); break;//COleVariant是一个字串
case VT_I2: A.Format(_T("%hd"),V_I2(&B));break;//是短整型
case VT_I4: A.Format(_T("%d"),V_I4(&B));break;//是长整型
case VT_R4: A.Format(_T("%e"),(double)V_R4(&B));break;//是浮点数
case VT_R8: A.Format(_T("%e"),V_R8(&B));break;//是浮点数
case VT_CY: A=COleCurrency(B).Format();break;//是货币值
case VT_DATE: A=COleDateTime(B).Format("%Y-%m-%d");break;//是日期
case VT_BOOL: A=V_BOOL(&B)?"True":"False";break;//是布尔值}
以上是关于COleVariant类的主要内容,如果未能解决你的问题,请参考以下文章
boost::variant 中持有的类的复制构造函数的问题
使用类作为数据类型时如何在 std::variant 中存储值?