您的位置:首页 > 运维架构

CCommand::Open的bBind参数使用方法

2010-04-05 15:42 260 查看
CCommand::Open方法的bBind参数是个很重要的参数。它的作用到底是什么呢?通过实验,我得出了一些答案,现概括如下。

我们知道CCommand是通过rowset和数据库进行交互的。在执行一条SQL语句后,貌似需要将SQL的执行结果(如SELECT的结果)同rowset邦定起来,如此便可以从rowset中取得结果。而bBind参数的作用就是决定在执行完SQL后是否自动完成这个邦定。bBind的默认实参为true,即完成自动邦定。

固然,bBind的默认实参用在SELECT类型的语句上是没有问题的,但对于INSERT、DELETE、UPDATE类型的语句来说就有问题了。原因很简单,这些SQL语句都不返回任何结果,你邦定啥捏?如果此时仍然以bBind的默认实参调用Open,会出现如下情况:

  1、SQL实际执行成功。比如执行的是INSERT,则插入成功。

  2、在Debug模式下Open会引发一个断言失败。通过断言的表达式估计大致情形是在进行邦定的时候断言指向结果的指针非空,而此时为空。

  3、不创建rowset。此时对MoveNext等方法的调用将引发断言失败。大致意思是指向rowset的指针为空。

由于没有创建rowset,也就不用在执行下一条SQL语句前调用Close了。不过ReleaseCommand还是需要调用的,否则虽然程序貌似正确执行,但实际内存泄露了。此外,即使INSERT等的执行不会访问rowset,如果调用Open前rowset存在(没有被Close掉),仍然会引发一个断言失败。

现在考虑SELECT类型的SQL语句。如果此时以bBind =
false调用Open会出现什么情况捏?经实验,结果是:rowset被正确创建,但内容没有被初始化。这具体是什么意思呢?举例来说,如果SELECT实际返回一个包含3条记录的结果集,则对MoveNext等方法的调用能正确反映这个数量,但每次通过CAccessor取出的内容都是没有初始化的。这时,需要手动调用Bind方法来完成rowset内容的初始化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: