作为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;