ADO之_variant_t 和 _bstr_t

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
_variant_t 和 _bstr_t
2008-06-03 15:28

BSTR(Basic STRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。它被描述成一个与自动化相兼容的类型。由于操作系统提供相应的API函数(如SysAllocString)来管理它以及一些默认的调度代码,因此BSTR实际上就是一个COM字符串,但它却在自动化技术以外的多种场合下得到广泛使用。图1描述了BSTR的结构,其中DWORD值是字符串中实际所占用的字节数,且它的值是字符串中Unicode字符的两倍。

在OLE、ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看OAIDL.H文件中VARIANT定义的一个简化版:

struct tagVARIANT {
VARTYPE vt;
union {
short iVal;      // VT_I2.
long lVal;       // VT_I4.
float fltVal;     // VT_R4.
double dblVal;     // VT_R8.
DATE date;         // VT_DATE.
BSTR bstrVal;     // VT_BSTR.

short * piVal;       // VT_BYREF|VT_I2.
long * plVal;        // VT_BYREF|VT_I4.
float * pfltVal;      // VT_BYREF|VT_R4.
double * pdblVal;     // VT_BYREF|VT_R8.
DATE * pdate;         // VT_BYREF|VT_DATE.
BSTR * pbstrVal;     // VT_BYREF|VT_BSTR.
};
};

  显然,VARIANT类型是一个C结构,它包含了一个类型成员vt、一些保留字节以及一个大的union类型。例如,如果vt为VT_I2,那么我们可以从iVal中读出VARIANT的值。同样,当给一个VARIANT变量赋值时,也要先指明其类型。例如:

VARIANT va;
:: VariantInit(&va); // 初始化
int a = 2002;
va.vt = VT_I4; // 指明long数据类型
va.lVal = a; // 赋值

_variant_t 是一个用于COM的VARIANT类,它的功能与COleVariant相似。不过在Visual C++.NET的MFC应用程序中使用时需要在代码文件前面添加下列两句:

  #i nclude "comutil.h"

  #pragma comment( lib, "comsupp.lib" )

_bstr_t是是C++对BSTR的封装,它的构造和析构函数分别调用SysAllocString和SysFreeString函数,其他操作是借用BSTR API函数。与_variant_t相似,使用时也要添加comutil.h和comsupp.lib。

CString转换成BSTR

通常是通过使用CStringT::AllocSysString来实现。例如:

CString str("This is a test");
BSTR bstrText = str.AllocSysString();

SysFreeString(bstrText); // 用完释放  


BSTR转换成CString

一般可按下列方法进行:

BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText;  

关于数据类型转换由于COM对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据,因此Cstring 类和COM对象是不兼容的,我们需要一组API来转换COM对象和C++类型的数据。_vatiant_t和_bstr_t就是这样两种对象。它们提供了通用的方法转换COM对象和C++类型的数据。

_bstr_t_variant_t _bstr_t_variant_t,主要介绍_bstr_t_variant_t两种数据类型的简单作用。 立即下载

相关推荐

ADO中_variant_t变量的使用与转换

转自:http://blog.csdn.net/zyq5945/article/details/5581453 下载 源代码 用ADO做数据库,有个麻烦的事情就是_variant_t变量的使用,使用本例中封装的CConvert类转换就方便了。 // Convert.h: interface for the CConvert class. // //////////////

qq492066487的专栏 855

MFC中使用ADO进行数据库操作

参考FROM:http://hi.baidu.com/sunkanghome/item/e1fda510b3186359f1090ee2 数据库与数据库编程: 当前各种主流数据库有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, S...

weixin_30258027的博客 348

VC++通过ADO连接数据库(三)_variant_t_bstr_t

用C++通过ADO对数据库进行操作,往往需要注意数据类型的转换问题。 这时可使用_variant_t_bstr_t这两个数据类型。它们是两个类,分别封装了 VARIANT BSTR,并增了一些方法。应为COM被设计成跨平台的,所以引入这两种数据类型。 在 COM 里用不了 CString 类,这时需要有一种更普遍的方式来处理字符串以及其他数据。VARIANT 就是一个结构体,内部包含一个

wanglx2012的专栏 1303

vc 中 ado 访问数据库

介绍VC用ADO访问数据库全攻略,介绍了VC用ADO来访问数据库的各个对象及各方法,很经典,也很实用,很值得一看。   正文一、ADO概述ADO是Microsoft为最新最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问操作数据库服务器中的数据。ADO 最主要的优点是易于使用、速度快、内存支出少磁盘

truement的专栏 3096

ADO学习(四)ADO扩展IADORecordBinding

当我们使用Visual C++进行ADO编程时,一项颇为头疼的工作就是对VARIANT字段类型的处理。通常做法是,先把VARIANT类型转换为形式上较为类似的C++类型,然后再把转换后的数据存放在一个类(class)或结构(structure)中。即便如此,对VARIANT数据类型的处理在一定程度上也影响到了程序的性能。   ADO为我们提供了一个接口,该接口使我们可以把数据直接读取到本地,

liujiayu2的专栏 1638

MFC ADO数据库编程中的_variant_t_bstr_t类型

_variant_t_bstr_t这两个类分别封装并管理VARIANTBSTR这两种数据类型,即是“Wrapper Class”VARIANTBSTR这两种类型是COM中使用的数据类型,VARIANT类型是一个结构体,而BSTR is  A 32-bit character pointer。为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。_variant_t_bstr_t这两

贝壳紫铃专栏 1566

MFC ADO数据库编程中的_variant_t_bstr_t

_variant_t_bstr_t这两个类分别封装并管理VARIANTBSTR这两种数据类型,即是“Wrapper Class”VARIANTBSTR这两种类型是COM中使用的数据类型,MSDN中可以查得,VARIANT类型是一个结构体,而BSTR is  A 32-bit character pointer。为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。_variant_t

wind1987321的专栏 1274

ADO 数据类型_bstr_t _variant_t

_bstr_t是BSTR_T这个数据类型对应的类 _variant_t是VARIANT这个数据类型的封装 Microsoft Specific Constructs a _bstr_t object. _bstr_t( ) throw( ); _bstr_t( const _bstr_t& s1 ) throw( ); _bstr_t(

ChampionLai 2358

BSTR、_bstr_t _variant_t与 CComBSTR

BSTR、_bstr_t 与 CComBSTRBSTR是宽字符指针;_bstr_t是C++对BSTR的封装;CComBSTR 是ATL对BSTR的封装;CComBSTR与_bstr_t对大量的操作符进行了重载,可以直接进行=,!=,==等操作,所以使用非常方便。特别是_bstr_t,建议大家使用它。char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上comutil.hcomsupp.libSysFreeStrin

liyun422828的专栏 635

_bstr_t _variant_t

_variant_t_bstr_t这两个类分别封装并管理VARIANTBSTR这两种数据类型,  VARIANTBSTR这两种类型是COM中使用的数据类型。   为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。  通过_variant_t_bstr_t这两个类,就可以方便的把C++类型变量转换成COM中的变量了。     m_Pconn->Open((_bstr_t)SQ

thisispan 733

_variant_t

_variant_t _variant_t_bstr_t这两个类分别封装并管理VARIANTBSTR这两种数据类型,   VARIANTBSTR这两种类型是COM中使用的数据类型。   为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。   通过_variant_t_bstr_t这两个类,就可以方便的把C++类型变量转换成COM中的变量了。

liuhongwei_study的专栏 452

_variant_t 数据类型介绍

_variant_t _bstr_t 这两个类分别用于封装并管理 VARIANT BSTR 这两种数据类型,VARIANT BSTR 这两种类型是 COM 中使用的数据类型。为了将C++中的变量应用到ADO编程中,只能进行数据类型的转换。通过 _variant_t _bstr_t 这两个类,就可以方便的把C++类型变量转换成COM中的变量了。 _variant

《好好先生》专栏 4526

VARIANT类型

VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。struct tagVARIANT { union { struct __tagVARIANT { VARTYPE vt; WORD wReserved1;...

weixin_30407099的博客 231

ADO数据库开发技术

ADO的底层是OLE DB,所以不仅能访问关系型数据库,也能访问非关系型数据库,更是现在最快速的数据库访问中间层。 1.ADO主要对象介绍 ADO对象包括:Connection Object(连接对象)、Command Object(命令对象)、RecordSet Object(记录集对象)、Field Object(字段对象)、Record Object(记录对象)、Error O...

203

ADO 数据库开发技术一些小知识

连接对象Connection  通过连接可以从应用程序中访问数据源。连接时必须指定要连接的数据源以及连接所 使用的用户名用户口令。  命令对象Command  可以通过已建立的连接发出命令,从而对数据源进行指定操作。一般情况下,命令可 以在数据源中添加、修改或删除数据,也可以检索数据。

foreverhuylee的专栏 1147

ADO学习笔记

一 、_variant_t_bstr_t      这两个类分别封装并管理VARIANTBSTR这两种数据类型    (1)VARIANTBSTR这两种类型是COM中使用的数据类型。    (2)为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。    (3)通过_variant_t_bstr_t这两个类,就可以方便的把C++类型变量转换成COM中的变量了。二、ADO异常捕获—...

xzsfg6825的博客 474
上一篇: 关于CGridCtrl
下一篇: atoi,atol,strtod,strtol,strtoul实现类型转换
markman101
博客等级 码龄19年 199粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值