COleVariant与常用基本数据类型之间的转换

时间:2023-02-11 17:25:03

http://hi.baidu.com/ton666/item/0f52fd430783b9e01381dac5

http://blog.csdn.net/limitedlove/article/details/1648315

COleVariant 类通逢装了 VARIANT 结构。实际的数据就在 VARIANT 结构中。
    使用 COleVariant 的两个操作
    operator LPCVARIANT
     Converts a COleVariant value into an LPCVARIANT.
    operator LPVARIANT
     Converts a COleVariant object into an LPVARIANT.
    可以得到 VARIANT 结构。其区别是,前者是个拷贝操作,将 VARIANT 结构的内容拷贝到目标中去,后者仅仅返回
    VARIANT 结构的指针。不管那种情况,现在我们都能访问到 VARIANT 所包含的数据了。余下的问题是如何解释数
    据内容。
    VARIANT 结构包含两部分。其一是 VARTYPE 型的成员变量vt;其二是个联合类型,这个联合包含了VC常用的几乎所有类型。因为联合用的是相同的存储空间,因此对联合的内容的解释依赖于 vt。
    例如,
    若 vt 的值是 VT_UI2, 说明该联合被解释为short int. 并使用成员变量名 iVal。
    若 vt 的的值是 VT_BSTR,说明该联合被解释为 BSTR 类型。并使用成员变量名 bstrVal。
    若 vt 的的值是 VT_BSTR|VT_BYREF,说明该联合被解释为BSTR 型指针。并使用成员变量名 pbstrVal。
    (其他详见 VARIANT 的联机帮助)
    *********************************
    若从数据库返回的是简单类型,如 short, long, 等,则直接引用既可。(主持人注:COleVariant类重载了“=”操作符,所以常用类型可以直接转换)若返回的是字符串类型,则有可能是 bstrVal 或pbstrVal。依赖于数据库服务程序。 BSTR 实际上就是个unicode 字符串,CString 的构造函数和赋值操作都能直接识别这一类型

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;//是布尔值

}

//----------------------------------------------------------------------------------------------------------
我发现 A=V_BSTRT(&B);   只能传递一个字符,有问题。
用下面这个方法,两句话就直接可以解决。哈哈,有时网上的东西还是要思考下
B.ChangeType(VT_BSTR);
A=B.bstrVal;