ADO是建立在COM之上的,但有时候它很蛋疼

来源:互联网 发布:瑞茜·威瑟斯彭 知乎 编辑:程序博客网 时间:2024/05/16 08:46
ADO对象访问模型
      1)ADO是微软整个COM战略体系中的一个组成部分

    活动数据对象(ADO)是一组由微软提供的COM组件。   ADO建立在微软所提倡的COM体系结构之上,它的所有接口都是自动化接口,因此在C++、VisualBasic、Delphi等支持COM的开发语言中通过接口都可以访问到ADO。ADO通过使用OLE   DB这一新技术实现了以相同方式可以访问关系数据库、文本文件、非关系数据库、索引服务器和活跃目录服务等的数据,扩大了应用程序中可使用的数据源范围,从而成为微软整个COM战略体系中访问数据源组件的首选,是ODBC的替代产品。
   
    2)ADO对象模型组成

 与微软的其它数据访问模型DAO和RDO相比,ADO对象模型非常精炼,仅由三个主要对象Connection、Command、Recordset和几个辅助对象组成。Connection对象提供OLE   DB数据源和对话对象之间的关联,它通过用户名称和口令来处理用户身份的鉴别,并提供事务处理的支持;它还提供执行方法,从而简化数据源的连接和数据检索的进程。Command对象封装了数据源可以解释的命令,该命令可以是SQL命令、存储过程或底层数据源可以理解的任何内容。Record   set用于表示从数据源中返回的表格数据,它封装了记录集合的导航、记录更新、记录删除和新记录的添加等方法,还提供了批量更新记录的能力。其它辅助对象则分别提供封装ADO错误、封装命令参数和封装记录集合的列。  

 3)ADO的特点分析

  (a)由于封装了许多底层工作,使用ADO与使用ODBC几乎是一样方便。
  (b)   ADO不仅具有ODBC的主要功能,而且ADO适用的数据源的范围要大的多。
  (c)在定义ADO记录集变量和数据库表字段绑定类时,要求记录集的字段变量、状态变量与数据库表字段的个数、顺序必须相同。这一点比在FMC中使用ODBC要复杂一些。但在数据库字段与ADO记录集字段变量绑定的宏中,ADO   提供的数据类型要远多于FMC中的RFX(如日期时间类型,在ODBC中只能转换为Cstring类型)。
  (d)ADO允许同一Connection实例下有多个Record   set实例。
  (e)ADO允许进行批更新(使用的Update   Batch方法),这样将大大减轻网络负担,提高数据库处理效率。

作为ODBC的替代产品,ADO确实有其过人之处。由于ADO数据源几乎覆盖了目前常见的数据源类型,对于ODBC所不支持的数据源,ADO无疑是唯一的选择。而ADO的批更新功能,更是网络环境下大数据量更新应用的重要因素。由于ADO缺乏大量的第三方厂商的支持,使得ADO目前远不如ODBC普及,但其面向对象的特性将使ADO具有比较广阔的发展前景 。




说了这么多,其实有两个重点:

1.ADO貌似比ODBC先进

2.ADO是建立在COM之上的


所以,在使用之前一定要先初始化COM....今天的亲身经历是,在一个使用ADO的程序中,忘了调用::CoInitialize(NULL)初始化,但是数据库连接这些在我的计算机上一切正常,等到程序发布,别的人放在他们的计算机上调试时,却抛出错误了:m_pConnection.CreateInstance(__uuidof(_Connection));函数调用失败,这显然是由于没有初始化的结果,添加::CoInitialize(NULL)后一切正常。

果断Google之,后得到一些结论:

1.我的操作系统是win7,不::CoInitialize(NULL)成功,另一个人的操作系统是xp,没有::CoInitialize(NULL)就失败了。难道win7和xp在这些模块的处理上不同了?win7先进了?

2.网上有人说同一个程序,PC机和笔记本的效果就不同,我发现确实这样,我的就是笔记本,另一个童鞋的是PC....

3.网上看到有些童鞋还提出,即使在同一台计算机上,不同的几个程序,初始化或者不初始化也可能有不同的结果。这个就很难解释了


但是,只要记得::CoInitialize(NULL)初始化,肯定是不会有问题的了。


还有就是要却别::CoInitialize(NULL)和AfxOleInit()的区别,OLE是建立在COM之上的技术,层次比COM要高。AfxOleInit()调用的是OleInitialize(),而OleInitialize()除了调用CoInitializeEx()来初始化COM库外,还进行一些其它的操作,这些操作对OLE应用来说是必须的。包括: 


 (1)Clipboard;  
 (2)Drag  and  drop;  
 (3)Object  linking  and  embedding(现在的OLE,已不再仅仅是Object  linking  and  embedding的概念);  
 (4)In-place  activation; 


总之AfxOleInit()中做了更多的工作,还有些童鞋说有时候使用::CoInitialize(NULL)初始化不行,但是AfxOleInit()却可以.....


 
 (1)Clipboard;  
  (2)Drag  and  drop;  
  (3)Object  linking  and  embedding(现在的OLE,已不再仅仅是Object  linking  and  embedding的概念);  
  (4)In-place  activation; 



原创粉丝点击