命令释放与记录释放

      在OLE DB的使用过程中,有几个关于释放的函数需要特别区分清楚,它们是:CCommand::Close、CCommand::ReleaseCommand以及CAccessorRowset::FreeRecordMemory。

      当使用CCommand进行数据库访问时,有三样东西是需要的,即行集(Rowset)、结果集存取器(Result set accessor)以及参数存取器(Parameter accessor)。下面简单说明下以上事物在数据库访问过程中是如何起作用的。使用CCommand::Open执行某SQL命令后即生成相应的(结果)行集。然后使用CCommand::MoveNext等命令依次将行集中的单条记录取出存入结果集存取器的缓冲中,此后客户程序便可从中取出所需数据。如果调用带输出参数的存储过程,则输出值通过参数存取器访问。

      现在阐释数据库访问中所需的不同释放过程。CCommand::Close用于释放行集和结果集存取器,CCommand::ReleaseCommand用于释放参数存取器及命令本身,CAccessorRowset::FreeRecordMemory用于释放结果集存取器中的单条记录。在执行完一条SQL命令准备执行下一条之前必须调用Close。如果不这样做,在调试模式下会引发一个断言失败。如果下一条准备执行的SQL命令是一条不同的SQL命令,则除了需要调用Close外还需要调用ReleaseCommand。通俗地说,此时调用ReleaseCommand释放了之前的SQL命令,为存储新的SQL命令做好了准备。此处隐含的意思是,如果需要重复多次执行同一条SQL命令,则除了最后一次执行过程外,其余的都仅需调用Close即可。这里还需要说明的一点是,对于某些提供者(比如SQLOLEDB),当调用了带输出参数的存储过程后,只有在Close了之后才能读取参数存取器中的存储过程输出值。

      那么CAccessor::FreeRecordMemory又是怎么一回事呢?FreeRecordMemory和上面提到的两个释放函数不是位于同一层次的。我们知道,当SQL执行的结果是一个集合时,需要通过MoveNext等函数来遍历,每次从中取一条记录存入结果集存取器缓冲中供客户程序访问。很显然,当缓冲中含有指向动态分配空间的指针时,在取出下一条记录前应该先将其释放。FreeRecordMemory就是拿来干这件事的: ) 之前提到的函数是关于结果集的,而这里的FreeRecordMemory是关于结果集中的单条记录的,所以说它们不是位于同一层次。

      最后再简单提一下CTable。CTable为CCommand的“缩水”版本,它不支持参数过程以及SQL命令。由上面的描述可知,此时ReleaseCommand的存在就没有任何意义了。这就是为什么CTable只有Close,而没有ReleaseCommand的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值