参考文章

http://blog.163.com/wslngcjsdxdr@126/blog/static/16219623020107634935586/

http://blog.csdn.net/dreamcs/article/details/7186633

http://blog.sina.com.cn/s/blog_6c3d32da0100ua13.html

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;

目前计算机语言多种多样,如C++、Java、Basic、Pascal等,此外还有JavaScript、VBScript、ActionScript等脚本语言,它们各自维护自己的数据类型,当使用C++这样强类型的语言来读取数据库或者与其他语言之间来交换数据时,它很有可能不知道获取到的数据的具体类型,这个时候必须借助于变体类型读取数据。VARIANT数据类型就具有跨语言的特性,同时它可以表示(存储)任意类型的数据。其在Visual C++中的定义:

typedef tagVARIANT VARIANT;  
typedef struct tagVARIANT VARIANTARG;

VARIANT 其实是一个结构,结构中用一个vt成员表示数据的类型,同时真正的数据则存储在union空间中。一般我们使用VARIANT的步骤如下所示。

定义一个VARIANT变量,如:var。

通过vt成员设定VARIANT变量的数据类型,如:var.vt = VT_I4。

通过对应的union成员设定数据内容,如:var.lVal = 100。

综上所述,利用VARIANT表示一个整型数据:

VARIANT var;  
var.vt = VT_I4; //指明整型数据
var.lVal = 100; //赋值
利用VARIANT表示一个布尔值:
VARIANT var;
var.vt = VT_BOOL; //指明整型数据
var.boolVal = VARIANT_TRUE; //赋值
利用VARIANT保存一个字符串:
VARIANT var;
var.vt = VT_BSTR;
var.bstrVal = SysAllocString(L"hello, world!");

根据以上的代码,读者可能会猜到,VARIANT的定义可能类似于如下:

struct VARIANT  
{
VARTYPE vt; //数据类型
union
{
LONG lVal; //VT_I4
VARIANT_BOOL boolVal //VT_BOOL
BSTR bstrVal; //VT_BSTR
}
};

实际上,VARIANT的定义就是这样的!只不过由于它需要支持的类型太多,所以它包含的联合成员会更多。限于篇幅,在此不再附出。

VARIANT支持的类型,也就是vt成员的取值如表4-3所示。

表4-3 VARIANT支持的类型

类型名

含义

VT_EMPTY

指示未指定值

VT_NULL

指示空值(类似于 SQL 中的空值)

VT_I2

指示 short 整数

VT_I4

指示 long 整数

VT_R4

指示 float 值

VT_R8

指示 double 值

VT_CY

指示货币值

VT_DATE

指示 DATE 值

VT_BSTR

指示 BSTR 字符串

VT_DISPATCH

指示 IDispatch 指针

VT_ERROR

指示 SCODE

VT_BOOL

指示一个布尔值

VT_VARIANT

指示 VARIANTfar 指针

VT_UNKNOWN

指示 IUnknown 指针

VT_DECIMAL

指示 decimal 值

VT_I1

指示 char 值

(续表)

类型名

含义

VT_UI1

指示 byte

VT_UI2

指示 unsignedshort

VT_UI4

指示 unsignedlong

VT_I8

指示 64 位整数

VT_UI8

指示 64 位无符号整数

VT_INT

指示整数值

VT_UINT

指示 unsigned 整数值

VT_VOID

指示 C 样式 void

VT_HRESULT

指示 HRESULT

VT_PTR

指示指针类型

VT_SAFEARRAY

指示 SAFEARRAY

VT_CARRAY

指示 C 样式数组

VT_USERDEFINED

指示用户定义的类型

VT_LPSTR

指示一个以 NULL 结尾的字符串

VT_LPWSTR

指示由 nullNothingnullptrnull

引用(在 Visual Basic

中为 Nothing) 终止的宽字符串

VT_RECORD

指示用户定义的类型

VT_FILETIME

指示 FILETIME 值

VT_BLOB

指示以长度为前缀的字节

VT_STREAM

指示随后是流的名称

VT_STORAGE

指示随后是存储的名称

VT_STREAMED_OBJECT

指示流包含对象

VT_STORED_OBJECT

指示存储包含对象

VT_BLOB_OBJECT

指示 Blob 包含对象

VT_CF

指示剪贴板格式

VT_CLSID

指示类 ID

VT_VECTOR

指示简单的已计数数组

VT_ARRAY

指示 SAFEARRAY 指针

VT_BYREF

指示值为引用

.2.5  _variant_t、CComVariant与COleVariant、CDBVariant

从上面可以看出VARIANT这种类型使用起来比较复杂,其实有简单的办法,那就是采用VARIANT的封装类_variant_t。_variant_t的构造函数接受基本数据类型的数据作为参数,如下列出其中的一小部分:

_variant_t(  
   short sSrc,  
   VARTYPE vtSrc = VT_I2   
);  
 
_variant_t(  
   long lSrc,  
   VARTYPE vtSrc = VT_I4   
);  
 
_variant_t(  
   float fltSrc   
) throw( );  
 
_variant_t(  
   double dblSrc,  
   VARTYPE vtSrc = VT_R8   
); 

另一方面,_variant_t提供了反向的转换函数,如将一个_variant_t转换成一个short数值,如下列出其中的一小部分:

operator short( ) const;   
operator long( ) const;   
operator float( ) const;   
operator double( ) const; 

因此可以看出,利用_variant_t可以很方便地实现VARIANT类型和基本数据类型之间的转换,如:

long l = 123;  
_variant_t lVal(l);  
long m = lVal; 

也可以用COleVariant和CComVariant来简化对VARIANT的操作,代码参考如下:

COleVariant v3 = _T("hello, world!");  
COleVariant v4 = (long)1999;  
CString str = (BSTR)v3.pbstrVal;  
long i = v4.lVal; 

VARIANT类图如图4-7所示。

498)this.style.width=498;" height=190> 
(点击查看大图)图4-7  VARIANT类图

此外,在MFC ODBC 编程中,我们还会接触到CDBVariant,CDBVariant没有任何基类,它的功能与COleVariant相似,唯一的差别是它不使用OLE。可以看出,Visual C++为变体提供了太多的封装类,如果可行的话,我们建议读者尽量在自己的代码中采用统一的类,如:_variant_t。

VARIANT、 _variant_t、CComVariant、COleVariant、CDBVariant的更多相关文章

  1. CSS3与页面布局学习总结(二)——Box Model、边距折叠、内联与块标签、CSSReset

    一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...

  2. C#、JAVA操作Hadoop(HDFS、Map/Reduce)真实过程概述。组件、源码下载。无法解决:Response status code does not indicate success: 500。

    一.Hadoop环境配置概述 三台虚拟机,操作系统为:Ubuntu 16.04. Hadoop版本:2.7.2 NameNode:192.168.72.132 DataNode:192.168.72. ...

  3. 教你一招:解决win10/win8.1系统在安装、卸载软件时出现2502、2503错误代码的问题

    经常遇到win10/win8.1系统在安装.卸载软件时出现2502.2503错误代码的问题. 解决办法: 1.打开任务管理器后,切换到“详细信息”选项卡,找到explore.exe这个进程,然后结束进 ...

  4. Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、

    特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣)                       ...

  5. 兼容8事件绑定与解绑addEventListener、removeEventListener和ie的attachEvent、detachEvent

    兼容8事件绑定与解绑addEventListener.removeEventListener和ie的attachEvent.detachEvent   ;(function(){ // 事件绑定 bi ...

  6. TFS API:三、TFS WorkItem添加和修改、保存

    TFS API:三.TFS  WorkItem添加和修改.保存 WorkItemStore:表示跟踪与运行 Team Foundation Server的服务器的工作项客户端连接. A.添加工作项 1 ...

  7. C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义

    类型判断符号: C#:object a;  if(a is int) { }  用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 inst ...

  8. TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释

    一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...

  9. Python学习笔记 之 递归、二维数组顺时针旋转90°、正则表达式

    递归.二维数组顺时针旋转90°.正则表达式 1.   递归算法是一种直接或间接调用自身算法的过程. 特点: 递归就是在过程或函数里调用自身 明确的递归结束条件,即递归出口 简洁,但是不提倡 递归次数多 ...

随机推荐

  1. nyoj 467 中缀式变后缀式 (栈)

    中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀 ...

  2. 【python测试开发栈】带你彻底搞明白python3编码原理

    在之前的文章中,我们介绍过编码格式的发展史:[文章传送门-todo].今天我们通过几个例子,来彻底搞清楚python3中的编码格式原理,这样你之后写python脚本时碰到编码问题,才能有章可循. 我们 ...

  3. 将Swagger2文档导出为HTML或markdown等格式离线阅读

    网上有很多<使用swagger2构建API文档>的文章,该文档是一个在线文档,需要使用HTTP访问.但是在我们日常使用swagger接口文档的时候,有的时候需要接口文档离线访问,如将文档导 ...

  4. 新闻实时分析系统-HBase分布式集群部署与设计

    HBase是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtable 的开源实现,与 ...

  5. 【搞定面试官】谈谈你对JDK中Executor的理解?

    ## 前言 随着当今处理器计算能力愈发强大,可用的核心数量越来越多,各个应用对其实现更高吞吐量的需求的不断增长,多线程 API 变得非常流行.在此背景下,Java自JDK1.5 提供了自己的多线程框架 ...

  6. es5设置属性不能修改

    /*es5*/ { var Person ={ name:'es5', age:19 } Object.defineProperty(Person,'sex',{ writable:false, va ...

  7. Python爬虫之Selenium的常用方法

    1.单个元素的选取 find_element_by_id      通过标签属性Id查找元素 find_element_by_name      通过标签属性name查找元素 find_element ...

  8. C#取视频某一帧图片

    首先下载 ffmpeg http://ffmpeg.org/ 注意一定要从官网下载,其他地方可以会有问题 解压后在 bin 目录下找到 ffmpeg.exe 用到的使命是 -i 视频地址 -ss 第几 ...

  9. vCenter Server Appliance(VCSA )6.7部署指南

    目录 简介 环境准备 开始安装 第一阶段安装 第二阶段安装 使用 简介 早期的VCSA支持 SUSE 和 Windows,不太懂SUSE,也不想用Windows 而在2018年4月17日VCSA 6. ...

  10. Xtrabackup 介绍

    目录 概念 备份方式 xtrabackup 特点 通信方式 备份过程 扩展理解 xtrabackup 如何实现增量备份 概念 Xtrabackup是由Percona开发的一个开源软件,可实现对Inno ...