《Ado_使用ADO封装类的数据库程序开发实例》由会员分享,可在线阅读,更多相关《Ado_使用ADO封装类的数据库程序开发实例(11页珍藏版)》请在金锄头文库上搜索。
1、Ado_使用 ADO 封装类的数据库程序开发实例.txt 精神失常的疯子不可怕,可怕的是精神正常的疯子!使用 ADO 封装类的数据库程序开发实例(上)作者:成真下载本文示例源代码源代码运行效果图如下:一、前言用过 ADO 的人都知道, 调用 ADO 要处理很多麻烦的事情,如异常处理等,要写很多 try - catch 块. 有点不甚其烦。我干脆把常用的函数都封装起来,免去老是要写 try - catch 块的麻烦。做起来虽然没有什么技术含量,但也比较烦琐,所以只完成了一部分,且由于时间及个人水平有限,没有对封装的东西作全面测试,并必定有很多错误,但想到对某些朋友可能有用。所以先捐出来了。-.在
2、介绍这两个类之前,让我们先来了解一下 ADO,本文假设你已有一定的编程能力:二、了解 ADO 的结构体系ADO(ActiveX Data Object, Active 数据对象)是 Microsoft 提供的一种面向对象,与语言无关的数据访问应用编程接口。据大部分资料介绍,它有如下主要特点:一:易于使用。二:可以访问多种数据源。三:访问速度快,效率高:四:方便 Web 应用。五:技术编程接口丰富。六:低内存支出和占用磁盘空间较少.正是看到 ADO 这么多优点,使我对用 ADO 开发数据库产生了兴趣.ADO 用起来也如前面所说的一样,确实不难。总的来说,ADO 模型包括了下列对象:连接(Conn
3、ection) 、命令 (Command)、记录集 (Recordset)、字段 (Field)、参数 (Parameter)、错误 (Error)、属性 (Property)、集合 、事件.它们之间的关系如下图:(1)我们最常用的主要是 Connection、Recordset 及 Command 这三个对象.(2)对于访问一个数据库来说,我们一般先建立一个 ADO 连接.(3)ADO 连接可以直接执行 SQL 语句来操纵数据库,但如果我们要对数据在应用程序和数据源之间进行存取的话,就需要用到记录集对象。一个 ADO 连接可以有多个 ADO 连接,但一个ADO 连接一般只能对应一个且必须对应
4、一个 ADO 连接.(4)另外如果你可进行更高级别的访问的话,还可能要用到命令对象。例如要调用存储过程等。(5)一个记录集包含有一个字段集,一个字段集则包含有多个字段对象。(6)同样一个命令对象也包含一个参数集,一个参数集则包含有多个参数对象。(7)连接对象也有一个错误集并包含有多个错误对象。这就是 ADO 各对象之间大致的关系.三、了解 ADO 连接在使用数据库之前,要先建立连接.一般先用 CreateInstance 方法创建 ADO 连接对象,然后就可以用 Open 方法连接到数据库。它的原型是 Open(BSTR ConnectionString, BSTR UserID, BSTR
5、Password, long Options);其中 UserID 和 Password 如果在ConnectionString 已经指明了用户名和密码,一般就可以不必管它们.Options 指的是是以同步方式(adConnectUnspecified)还是以异步方式(adAsyncConnect)进行连接,默认为同步.这个函数的关键这处在于 ConnectionString 参数,它决定了我们将以什么方式连接到什么数据源,例如:如果是 Access 数据库,它的格式则一般为: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb;如果是 SQ
6、L Server: Provider=SQLOLEDB.1;Data Source=sqlservername;Initial Catalog=master;UserID=sa; PWD=password;具体的内容视你的环境而定.要连接到其他数据库,请参考相关的资料.例如:_ConnectionPtr pConnection;LPCSTR strConnect = Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb;/创建 Connection 对象-HRESULT hr = pConnection.CreateInstance(ADO
7、DB.Connection);/设置连接时间-pConnection-put_ConnectionTimeout(long(5);if (SUCCEEDED(hr)/ 连接数据库-pConnection-Open(strConnect, , , adConnectUnspecified)四、了解 ADO 记录集创建了 ADO 连接,我们就可以通过 ADO 记录集来访问数据库了.同样,在使用记录集之前要先创建对象.然后调用 Open 方法打开记录集.它不但可以执行普通的 SQL 语句,还可以调用存储过程等等:Open(VARIANT Source, VARIANT ActiveConnectio
8、n, CursorTypeEnum CursorType,LockTypeEnum LockType, LONG Options).其中 ActiveConnection 参数为一个有效的 Connection 对象名,就是我们在上面所说过的ADO 连接对象.CursorType 参数指的是记录集光标类型,在官方的资料中是这样说明它的取值类型的:1.adOpenForwardOnly 仅向前游标,默认值。除了只能在记录中向前滚动外,与静态游标相同。当只需要在记录集中单向移动时,使用它可提高性能。 2.adOpenKeyset 键集游标。尽管从您的记录集不能访问其他用户删除的记录,但除无法查看其
9、他用户添加的记录外,键集游标与动态游标相似。仍然可以看见其他用户更改的数据。 3.adOpenDynamic 动态游标。可以看见其他用户所作的添加、更改和删除。允许在记录集中进行所有类型的移动,但不包括提供者不支持的书签操作。 4.adOpenStatic 静态游标。可以用来查找数据或生成报告的记录集合的静态副本。另外,对其他用户所作的添加、更改或删除不可见。 我们现在可不用管这么多,就用默认的 adOpenStatic 类型吧.LockType 参数,用于指示在什么时候锁定记录:AdLockReadOnly (默认值)只读 - 不能改变数据。 AdLockPessimistic 保守式锁定(
10、逐个) - 提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录。 AdLockOptimistic 开放式锁定(逐个) - 提供者使用开放式锁定,只在调用 Update 方法时才锁定记录。 AdLockBatchOptimistic 开放式批更新-用于批更新模式(与立即更新模式相对) 。 Options 参数指的是操作类型:adCmdText 指示 strSQL 为命令文本, 即普通的 SQL 语句. adCmdTable 指示 ADO 生成 SQL 查询以便从在 strSQL 中命名的表中返回所有行. adCmdTableDirect 指示所作的更改在 strSQL
11、中命名的表中返回所有行. adCmdStoredProc 指示 strSQL 为存储过程. adCmdUnknown 指示 strSQL 参数中的命令类型为未知 adCmdFile 指示应从在 strSQL 中命名的文件中恢复保留(保存的)Recordset. adAsyncExecute 指示应异步执行 strSQL. adAsyncFetch 指示在提取 Initial Fetch Size 属性中指定的初始数量后,应该异步提取所有剩余的行.如果所需的行尚未提取,主要的线程将被堵塞直到行重新可用. adAsyncFetchNonBlocking 指示主要线程在提取期间从未堵塞. 如果所请求
12、的行尚未提取,当前行自动移到文件末尾. 唉又是一大串,如果你只是要执行 SQL 语句,就把它设为 adCmdText 吧. 这样 Source 就是你要执行的 SQL 语句了.例如:LPCSTR strSQL = select * from vckbasetable;_RecordsetPtr pRecordset;pRecordset.CreateInstance(ADODB.Recordset);pRecordset-Open(_bstr_t(strSQL), _variant_t(IDispatch*)pConnection, true), adOpenStatic, AdLockOpt
13、imistic , adCmdText);ADO 中读取记录集中指定字段的值一般有两种方法:第一种:FieldsPtr pFields;pRecordset-get_Fields(&pFields);pFields-ItemLCOLUMN_NAME-Value;/或 pFields-Itemlong(index)-Value;/其中 index 为整型或长整型.GetFields()函数返回的是记录集对象的字段集合对象的指针.第二种:pRecordset-get_Collect(COLUMN_NAME);/或 pRecordset-get_Collect(long(index);它们都将返回一
14、个_variant_t 类型的值,推荐使用后一种方法.例如:int ncol = rset.GetFieldsCount();while (!rset.IsEOF() for (int i = 0; i get_Fields(&pFields);然后可以获得相应的字段对象:long lIndex = 0;FieldPtr pf = pFields-GetItem(_variant_t(lIndex);/或: FieldPtr pf = pFields-GetItem(COLUMN_NAME);字段对象有很多有用的属性,这些可以参考我的源代码或其他相关资料.如:get_ActualSize(lo
15、ng *pl) /实际宽度get_Attributes(long *pl) /属性get_DefinedSize(long *pl) /定义宽度(以字节为单位,如整型为 4,长整型为 8.)get_Name(BSTR *pbstr) /字段名get_Type(DataTypeEnum *pDataType) /数据类型get_Value(VARIANT *pvar) / 字段的值有了以上对 ADO 的基本了解后,我们将正式开始编写应用程序,请看下文。使用 ADO 封装类的数据库程序开发实例(下)作者:成真在使用 ADO 封装类的数据库程序开发实例(上) 中详细介绍了 ADO 的一些基本的概念,接下来让我们在此基础上进行具体的编程。五、开始编写 ADO 应用程序.使用 ADO 之前,我们另外还需要添加下面的语句,如此把 ADO 的库引入到工程中. #import c:program filescommon filessystemadomsado15.dll no_namespace rename(EOF,adoEOF) 根据机器安装时候的设置不同具体的路径可能不一样。另外编译的时候会出现如下的警告信息:msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, re