VC下使用ADO操作

    技术2022-05-11  12

    使用ADO+SQL操作各类数据库是当前的主流,本人结合自己学习和使用ADO开发数据库的亲身经历,给大家一起分享利用ADO开发遇到的常见问题和解决方案。本人开发环境为VC6.0,操作系统WindowsXP。

          操作数据库,拿最简单的ACCESS来说,不少人使用ODBC,本人在学习之初也使用过ODBC,但小的程序可以,大的维护起来真是要命阿……ODBC要 配置数据源,而且当表的结构更改时,又要重新给各个字段绑定变量再进行操作,很罗嗦很繁琐!而ADO是基于OLEDB的封装,操作的时候省却了很多不必要 的麻烦,维护起来也很方便。有人说,ADO操作语句比较复杂,难记,不错,但是对于一个程序员来讲,复杂难记的语句多得是,而相信各位的智商一定不差,所 以对付这些根本不成难题,我们应该有信心才对。

         既然ADO那么好用,那么学习数据库的操作,就直接学习ADO吧,其他的DAO,ODBC等等,简单了解即可。

         入门阶段,我不建议直接使用一些封装完善的ADO类库,大家应该都知道,来自Argentina的一位大师级人物Carlos Antollini封装了一个很强大的ADO集合,利用这个集合对ADO进行数据库操作真是太方便了!可惜,这位大师并没有在它的实例工程内把封装好的 ADO集合各个函数的功能以代码形式编写出来,而只是在其发表的文章内,罗列了常用的功能代码。DataBinding这个实例,只是简单地和一个 DataGrid相互连接了而已……

         所以,我建议初学者入门先学习一下未封装的ADO基本操作,明确ADO运行机制,然后再下载和使用Carlos Antollini封装的ADO类库。具体请到这里参考国内一位高手徐景周的文章:

    直接通过ADO操作Access数据库      作者讲的很详细而且通俗,下载工程代码自己编译调试后,VC+ADO的基本操作就算入门了。

         这个时候,大家可以到codeproject去下载Carlos Antollini封装的ADO集合,里边的功能应有尽有,而且经过不少人的测试和提问,作者本人的不断改进,目前封装的算是很完善,功能足够强大了,大 家可以到这里下载最新的版本 ado2 V2.20 A set of ADO classes - version 2.20

           Carlos Antollini封装的ADO类库 V2.10包含2个文件 ado.h ado.cpp   V2.20包含4个文件oledb2.h oledb2.cpp  ado.h  ado.cpp一般用户使用前者V2.10即可达到所需要的功能。       下载工程实例MS Data Control Bind sample,编译运行,发现很正常。       但是,如果在自己新建的任意工程内,把关键文件丢入当前工程的文件夹内,然后利用菜单的project->Add to project->Files把 ado.h 

    ado.cpp引入 然后编译,这个时候会发现,一开始就出现问题,编译无法通过…… 出现一个错误: fatal error C1010: unexpected end of file while looking for precompiled header directive

    解决方案有2个, 1、如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的 Settings,选择C/C++选项卡,从

    Category组合框中选中Precompiled Headers,选择Not Using Precompiled headers 或者 Automatic Use of precompiled Headers(MS Data

    Control Bind sample内就是这样设置的,请读者仔细对比)

    2、在文件开头添加: #include "stdafx.h"

         这里staafx.h是预编译头文件,所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、 Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。        预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。      编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在 指令#include   "stdafx.h"前的代码都是预编译的,它跳过#include   "stdafx.   h"指令,使用projectname.pch编译这条指令之后的所有代码。        因此,所有的CPP实现文件第一条语句都是:#include   "stdafx.h"。   (所以呀,这个预编译文件stdafx.h就不要放到.h里面了)

    然后,将原先的Debug全部删除(别心疼!)然后Rebuild All,就发现,这个时候,编译成功!

         但某些更高级别的场合,需要用上封装更完善的V2.20,这个时候,可以引入其包含的4个文件。 同理,在每个cpp文件前边加入 #include "stdafx.h" (也就是解决方案2) 再次编译,出现错误: fatal error C1083: Cannot open type library file: 'MSJRO.DLL': No such file or directory

    应该按如下方式进行解决, 将ado2.h 修改引用项为:

    #pragma warning (disable: 4146) // CG : In order to use this code against a different version of ADO, the appropriate // ADO library needs to be used in the #import statement #pragma message ("Make sure you go to Tools.Options.Directories.Library files and add the paths to msado15.dll and msjro.dll

    will usually be in C://Program Files//Common Files//System//ado") // 使用如下2行 #import "C:/Program Files/Common Files/System/ado/msado15.dll" rename("EOF", "EndOfFile") #import "C:/Program Files/Common Files/System/ado/MSJRO.DLL" no_namespace rename("ReplicaTypeEnum", "_ReplicaTypeEnum")

    // 以下2行注释掉 //#import <msado15.dll> rename("EOF", "EndOfFile") //#import <MSJRO.DLL> no_namespace rename("ReplicaTypeEnum", "_ReplicaTypeEnum")

    using namespace ADODB;

    #pragma warning (default: 4146)

    #include "icrsint.h"

    再次编译,不巧,又出现了错误: Cannot open type library file: 'oledb32.dll'

    双击跳转至对应的行, 位于oledb2.h #import <oledb32.dll> no_namespace

    依葫芦画瓢,将代码修改掉: #pragma warning (disable: 4192) #include "ado2.h" #pragma message ("Make sure you go to Tools.Options.Directories.Library files and add the paths to oledb32.dll and msjro.dll

    will usually be in C://Program Files//Common Files//System//ole db") // 使用如下2行 #import "C:/Program Files/Common Files/System/ole db/oledb32.dll" no_namespace // 指定绝对路径,把下行注释掉! //#import <oledb32.dll> no_namespace

    #pragma warning (default: 4192)

    再次编译,就发现,呵呵,一切成功!!

          注意,和ADO相关的操作,Debug内会生成 .tlh  .tli,这2类文件简介如下:

    tlh、tli文件 是vc++编译器解析tlb文件生成的标准c++文件。因为odl和tlb并不是C++标准的东东,有必要把它们翻译成标准的C++类型,使得C++开发 者可以使用。相信vb和j++也会把tlb翻译成自己语言兼容的类型描述信息。tlh相当于类型申明(头文件),tli相当于定义实现(CPP文件)。可 以用写字板打开查看其内容。

         每次更新,需要在菜单里选择全部重新编译,或者把Debug内所有旧的 tlh、tli文件删除,否则编译器仍然会认为.tlh和.tli文件是最新的。也就是说,如果原先操作不当留下了由问题的tlh、tli文件,修改后直 接编译,还是会报告相同的错误,所以需要进行上述处理。


    最新回复(0)