使用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
//#import
using namespace ADODB;
#pragma warning (default: 4146)
#include "icrsint.h"
再次编译,不巧,又出现了错误:
Cannot open type library file: 'oledb32.dll'
双击跳转至对应的行,
位于oledb2.h
#import
依葫芦画瓢,将代码修改掉:
#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
#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文件,修改后直接编译,还是会报告相同的错误,所以需要进行上述处理。
下一篇文章,本人将谈谈如何应用ADO类,ADO带给了我们哪些方便,敬请各位关注!