VARIANT、 _variant_t、CComVariant、COleVariant、CDBVariant
参考文章
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的更多相关文章
- CSS3与页面布局学习总结(二)——Box Model、边距折叠、内联与块标签、CSSReset
一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...
- 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. ...
- 教你一招:解决win10/win8.1系统在安装、卸载软件时出现2502、2503错误代码的问题
经常遇到win10/win8.1系统在安装.卸载软件时出现2502.2503错误代码的问题. 解决办法: 1.打开任务管理器后,切换到“详细信息”选项卡,找到explore.exe这个进程,然后结束进 ...
- Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、
特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣) ...
- 兼容8事件绑定与解绑addEventListener、removeEventListener和ie的attachEvent、detachEvent
兼容8事件绑定与解绑addEventListener.removeEventListener和ie的attachEvent.detachEvent ;(function(){ // 事件绑定 bi ...
- TFS API:三、TFS WorkItem添加和修改、保存
TFS API:三.TFS WorkItem添加和修改.保存 WorkItemStore:表示跟踪与运行 Team Foundation Server的服务器的工作项客户端连接. A.添加工作项 1 ...
- C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义
类型判断符号: C#:object a; if(a is int) { } 用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 inst ...
- TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释
一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...
- Python学习笔记 之 递归、二维数组顺时针旋转90°、正则表达式
递归.二维数组顺时针旋转90°.正则表达式 1. 递归算法是一种直接或间接调用自身算法的过程. 特点: 递归就是在过程或函数里调用自身 明确的递归结束条件,即递归出口 简洁,但是不提倡 递归次数多 ...
随机推荐
- thinkphp 6.0 在 initialize 中重定向无效
thinkphp 6.0 在 initialize 中重定向无效 改用 header() 函数 实例: // header('location:/index.php/模块/控制器/方法'); head ...
- nyoj 63-小猴子下落 (模拟)
63-小猴子下落 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:2 submit:5 题目描述: 有一颗二叉树,最大深度为D,且所有叶子的深度都相同 ...
- 分析facebook的AsyncDisplayKit框架中的Transaction的工作原理
在AsyncDisplayKit框架中有一个_ASAsyncTransaction模块,用于AsyncDiplayNode的异步事务,使用了dispatch_group实现. 主要目的是将operat ...
- 【algo&ds】7.最短路径问题
单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径 (有向)无权图:BFS (有向)有权图:Dijkstra算法 多源最短路径问题:求任意两顶点间的最短路径 直接将单源最短路算法调用|V ...
- HTML建立超链接
链接是HTML文档的最基本特征之一.超文本链接英文名为hyperlink,它能够让浏览器在各个独立的页面之间方便地跳转.超链接有外部链接.电子邮件链接.锚点链接等. a标签 网页中<a& ...
- [UWP]用Win2D实现镂空文字
1. 前言 之前用PointLight做了一个番茄钟,效果还不错,具体可见这篇文章: [UWP]使用PointLight并实现动画效果 后来试玩了Win2D,这次就用Win2D实现文字的镂空效果,配合 ...
- Python算法——《算法图解》笔记
算法目录 二分查找 大O表示法 选择排序 递归 快速排序,分而治之(D&C) 散列表——字典 广度优先搜索——BFS Dijkstra算法 贪婪算法 二分查找 # 要求list是有序表,num ...
- 像黑客一样写博客–Pelican快速搭建静态博客
"像黑客一样写博客",通过文本编辑器(Markdown编辑器)即可实现写博客,而且是静态的,很神奇吧,这里的方案是Pelican. 为啥叫 Pelican 这么奇怪的名字 &quo ...
- day 28 黏包 ssh模块 subprocess模块
套接字的信仰 一切皆文件 昨日作业: import socket sock=socket.socket() # TCP协议 IP_PORT=("127.0.0.1",8899) s ...
- nginx的使用,以及反向代理,负载均衡,从安装到使用,全部步骤。
先总结nginx实现负载均衡的原理,在这之前先的知道反向代理,因为nginx的负载均衡是在反向代理的基础上实现的: 1.反向代理:通过在nginx的配置文件 (vim /opt/nginx196/co ...
498)this.style.width=498;" height=190>