CDynamicAccessor的应用

     一直以来CAccessor都用得挺好,但今天突然遭遇到CAccessor的局限性了。不过好在发现了CDynamicAccessor这东西,用它解决了问题。

     MSDN上说当你对目标数据源的结构,比如表的构成,很清楚时,使用CAccessor;当你对目标数据源不甚了解时则使用CDynamicAccessor。理论上讲,MSDN的说法是没有问题的,但我实在想象不出除了去hack别人的数据库外,我还会在什么样的情况下对一个自己都不清楚的数据库进行操作。我这次使用CDynamicAccessor也不是为了访问未知数据库,而是为了解决下面这样一个问题:

     假设我们现在使用SELECT *来读取一张表的信息。如果使用CAccesor,我们需根据目标表的结构专门定义一个数据结构(结构体或类)作为CAccessor的模板参数。如果仅需要获取表中某些字段的信息,为了方便,我们还是可以复用之前定义的数据结构,还是使用SELECT *,然后在客户程序中仅处理我们感兴趣的字段就行了。上面的做法显然会提高程序的空间复杂度,不过这还不是我想说的问题。假设我们现在需要访问N张表,则在一般情况下我们需要定义N个数据结构,每张表对应一个数据结构。如果这样的线性工作量你都还算可以勉强接受,那么请相信我,下面的情况肯定会让你受不了的。当我们进行连接查询时,得到的结果的结构可能是多张表结构的组合!一提到“组合”这个词,想必接触过算法的人都知道这玩意儿的增长有多快吧。我们总不可能针对每一种可能的组合都去定义一个数据结构吧。此时,我们对数据源的结构是清楚的,但仍使用CDynamicAccessor来解决这个问题。

     CDynamicAccessor不是模板类,可以直接使用。它可以动态地自适应目标表结构。这个过程可以简单理解为根据实际情况动态地生成了那个使用CAccessor时我们需要自己定义的数据结构。CDynamicAccessor颇有泛型编程的感觉,在使用时需要特别注意数据类型的问题,比如如果是整型,那么它具体占多少字节等。在使用CDynamicAccessor时强制类型转换也是会经常用到的,如从void*到其它指针类型的转换。还记得用向导生成Consumer时它会为每个字段都生成相应的一个状态变量和长度变量吗?那个长度变量就可以用在这里指导类型转换。如你可以使用GetLength函数来获取一个整型究竟占多少字节。CDynamicAccessor还提供了GetColumnType函数来返回某字段的类型。由于我们本身就知道字段类型,所以GetColumnType在我们现在讨论的这个问题中用不到。GetValue函数实际取得某字段的值。这是一个重载函数。当你使用返回void*类型的重载时,即使返回值实际是指向一个字符串,也不要试图自己在客户程序中去释放它。使用CDynamicAccessor时所有字段的值都是存储在一个由CDynamicAccessor自己维护的缓冲区中,无需外界干预。因此,你也不需要再使用FreeRecordMemory函数了(MSDN CAccessor的说明里专门提到了这个函数)。GetColumnCount函数顾名思义,返回表的字段数。同GetColumnType一样,在这个问题中我们可以不需要该函数(在考虑到通用性、可维护性等问题时我们可能还是会在这个问题中选择使用该函数)。CDynamicAccessor还提供了其它许多函数,自取去MSDN查吧,这里就不费话了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值