使用者向导生成的几个关键方法简析

     使用OLE DB进行数据库编程时,可以通过向导快速建立一个使用者(Consumer)。向导会自动生成一些方法。为了正确使用生成的使用者,弄清楚这些方法究竟做些什么是必要的。下面就对其中比较关键的几个做一个简单分析。(注:以下结论主要通过实验和阅读源代码得出,仅供参考。如有错误还望指正。)

     首先我们需要明白一点,那就是在创建使用者时你把如下一些基本信息提供给了向导:欲连接的数据库服务器、服务器登录信息、欲访问的数据库以及欲访问的表。向导然后基于这些信息自动生成使用者。

     OpenDataSource :这是一个在名字上比较有误导性的方法。一般来说,我们手动访问数据库时都需要进行两个初始步骤:1、通过CDataSource建立和数据源的连接;2、基于建立的连接创建CSession。从OpenDataSource这个名字看,它似乎仅完成了连接数据源的任务,但实际上它还完成了创建CSession的任务,把两个初始步骤全部完成了。这个函数没有任何参数,它会在内部自动利用之前你提供给向导的信息。这里就出现了这样一个问题:你提供给向导的信息(比如登陆ID及密码)是以明文形式保存在源代码中的(初始化字符串),但这些信息同时又可能是需要保密的。为此VC会默认在源代码中相应地方(也就是OpenDataSource使用这个初始化字符串的地方) 加上了一个#error标记以提醒你注意。此时进行编译,将在#error处产生一个编译错误。只有当你对该初始化字符串进行检查并移出#error标记后才能正常编译链接。如果我们想使用oledb32.dll提供的连接建立对话框进行数据源的连接,更改#error处的代码为使用不带任何实参的Open即可(默认是使用OpenFromInitializationString)。

     OpenAll :这个方法没有任何参数,它首先调用OpenDataSource,然后建立默认的SQL命令(一个类似SELECT *的命令)并执行,获取目标表的所有行(记得我们之前提供给了向导欲访问的表信息,所以调用OpenAll时不需要给出目标表信息)。由此可知,在进行后续SQL命令执行操作之前应根据需要调用Close、ReleaseCommand或CloseAll(下面将要介绍) 等方法。

     CloseDataSource :虽然从名字看貌似是关闭CDataSource,不过源代码表明它实际关闭CSession对象。

     CloseAll :顺序调用Close,ReleaseCommand和CloseDataSource。

     细心的读者可能会发现这样一个问题:CDataSource的Close哪儿去了那?查阅OpenDataSource的源代码发现在函数内部定义了一CDataSource的自动对象_db。在用_db创建了一个CSession(被定义成使用者的一个属性)之后,_db就随着函数的返回结束了自己短暂的生命~。换句话说,CDataSource还没有调用Close就挂了。话说至此,貌似memory leak了。继续察看CDataSource的源代码,发现居然没有析构函数。不过再一细看,猛然发现其唯一的一个成员变量是一智能指针类型并且Close方法正好调用的是这个智能指针的Release方法...... 所以...... 不用我多说你也应该明白了吧。然而回过头来一想,CSession的存在不依赖于对应CDataSource的存在吗?对于这个问题,我只能说根据实验结果和源代码分析貌似是这样的。至此,前面的CloseDataSource和CloseAll也应该清楚了。

     MSDN不是万能的,有时会越看越糊涂,甚至是被误导。适当的时候还是需要阅读源代码的,正所谓“源码之下,了无秘密”。而且由于ATL OLE DB是一个模板库,Microsoft无法直接提供处理好的二进制文件,这也为源码阅读提供了方便: )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值