分享
 
 
 

使用ADO封装类的数据库程序开发实例(上)

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

源代码运行效果图如下:

用过ADO的人都知道, 调用ADO要处理很多"麻烦"的事情,如异常处理等,要写很多try - catch块. 有点不甚其烦。我干脆把常用的函数都封装起来,免去老是要写try - catch块的麻烦。做起来虽然没有什么技术含量,但也比较烦琐,所以只完成了一部分,且由于时间及个人水平有限,没有对封装的东西作全面测试,并必定有很多错误,但想到对某些朋友可能有用。所以先"捐"出来了。^-^.

在介绍这两个类之前,让我们先来了解一下ADO,本文假设你已有一定的编程能力:

一、了解ADO的结构体系

ADO(ActiveX Data Object, Active 数据对象)是Microsoft提供的一种面向对象,与语言无关的数据访问应用编程接口。据大部分资料介绍,它有如下主要特点:

一:易于使用。

二:可以访问多种数据源。

三:访问速度快,效率高:

四:方便Web应用。

五:技术编程接口丰富。

六:低内存支出和占用磁盘空间较少.

正是看到ADO这么多优点,使我对用ADO开发数据库产生了兴趣.ADO用起来也如前面所说的一样,确实不难。总的来说,ADO模型包括了下列对象:连接(Connection)、命令 (Command)、记录集 (Recordset)、字段 (Field)、参数 (Parameter)、错误 (Error)、属性 (Property)、集合 、事件.它们之间的关系如下图:

(2)对于访问一个数据库来说,我们一般先建立一个ADO连接.

(3)ADO连接可以直接执行SQL语句来操纵数据库,但如果我们要对数据在应用程序和数据源之间进行存取的话,就需要用到记录集对象。一个ADO连接可以有多个ADO连接,但一个ADO连接一般只能对应一个且必须对应一个ADO连接.

(4)另外如果你可进行更高级别的访问的话,还可能要用到命令对象。例如要调用存储过程等。

(5)一个记录集包含有一个字段集,一个字段集则包含有多个字段对象。

(6)同样一个命令对象也包含一个参数集,一个参数集则包含有多个参数对象。

(7)连接对象也有一个错误集并包含有多个错误对象。

这就是ADO各对象之间大致的关系.

二、了解ADO连接

在使用数据库之前,要先建立连接.一般先用CreateInstance方法创建ADO连接对象,然后就可以用Open方法连接到数据库。它的原型是 Open(BSTR ConnectionString, BSTR UserID, BSTR Password, long Options);其中UserID和Password如果在ConnectionString已经指明了用户名和密码,一般就可以不必管它们.Options指的是是以同步方式(adConnectUnspecified)还是以异步方式(adAsyncConnect)进行连接,默认为同步.这个函数的关键这处在于ConnectionString参数,它决定了我们将以什么方式连接到什么数据源,例如:

如果是Access数据库,它的格式则一般为: "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb";

如果是SQL 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("ADODB.Connection");

//设置连接时间-----------------------------------

pConnection-put_ConnectionTimeout(long(5));

if (SUCCEEDED(hr))

{

// 连接数据库---------------------------------------------

pConnection-Open(strConnect, "", "", adConnectUnspecified))

}

三、了解ADO记录集

创建了ADO连接,我们就可以通过ADO记录集来访问数据库了.同样,在使用记录集之前要先创建对象.然后调用Open方法打开记录集.它不但可以执行普通的SQL语句,还可以调用存储过程等等:

Open(VARIANT Source, VARIANT ActiveConnection, CursorTypeEnum CursorType,LockTypeEnum LockType, LONG Options).

其中ActiveConnection参数为一个有效的 Connection 对象名,就是我们在上面所说过的ADO连接对象.

CursorType参数指的是记录集光标类型,在官方的资料中是这样说明它的取值类型的:

1.adOpenForwardOnly 仅向前游标,默认值。除了只能在记录中向前滚动外,与静态游标相同。当只需要在记录集中单向移动时,使用它可提高性能。

2.adOpenKeyset 键集游标。尽管从您的记录集不能访问其他用户删除的记录,但除无法查看其他用户添加的记录外,键集游标与动态游标相似。仍然可以看见其他用户更改的数据。

3.adOpenDynamic 动态游标。可以看见其他用户所作的添加、更改和删除。允许在记录集中进行所有类型的移动,但不包括提供者不支持的书签操作。

4.adOpenStatic 静态游标。可以用来查找数据或生成报告的记录集合的静态副本。另外,对其他用户所作的添加、更改或删除不可见。

我们现在可不用管这么多,就用默认的adOpenStatic类型吧.

LockType参数,用于指示在什么时候锁定记录:

AdLockReadOnly (默认值)只读 - 不能改变数据。

AdLockPessimistic 保守式锁定(逐个) - 提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录。

AdLockOptimistic 开放式锁定(逐个) - 提供者使用开放式锁定,只在调用Update 方法时才锁定记录。

AdLockBatchOptimistic 开放式批更新-用于批更新模式(与立即更新模式相对)。

Options参数指的是操作类型:

adCmdText 指示strSQL为命令文本, 即普通的SQL语句.

adCmdTable 指示ADO生成SQL查询以便从在strSQL中命名的表中返回所有行.

adCmdTableDirect 指示所作的更改在strSQL中命名的表中返回所有行.

adCmdStoredProc 指示strSQL为存储过程.

adCmdUnknown 指示strSQL参数中的命令类型为未知

adCmdFile 指示应从在strSQL中命名的文件中恢复保留(保存的)Recordset.

adAsyncExecute 指示应异步执行strSQL.

adAsyncFetch 指示在提取 Initial Fetch Size 属性中指定的初始数量后,应该异步提取所有剩余的行.如果所需的行尚未提取,主要的线程将被堵塞直到行重新可用.

adAsyncFetchNonBlocking 指示主要线程在提取期间从未堵塞. 如果所请求的行尚未提取,当前行自动移到文件末尾.

唉又是一大串,如果你只是要执行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,

AdLockOptimistic ,

adCmdText);

ADO中读取记录集中指定字段的值一般有两种方法:

第一种:FieldsPtr pFields;

pRecordset-get_Fields(&pFields);

pFields-Item[L"COLUMN_NAME"]-Value;

//或pFields-Item[long(index)]-Value;

//其中index为整型或长整型.GetFields()函数返回的是记录集对象的字段集合对象的指针.

第二种:pRecordset-get_Collect("COLUMN_NAME");

//或pRecordset-get_Collect(long(index));

它们都将返回一个_variant_t类型的值,推荐使用后一种方法.

例如:int ncol = rset.GetFieldsCount();

while (!rset.IsEOF())

{

for (int i = 0; i

{

rset.GetValueString(value, (long)(i));

}

rset.MoveNext();

}

四、了解ADO字段.

一个记录集通常包含多个字段,通过访问记录,我们可以得到很多有用的信息,如字段名,字段的数据类型,定义的宽度,实际占有的宽度等等:

一般用记录集的get_Fields方法取得字段集合对象:FieldsPtr pFields;

Recordset-get_Fields(&pFields);

然后可以获得相应的字段对象:long lIndex = 0;

FieldPtr pf = pFields-GetItem(_variant_t(lIndex));

//或: FieldPtr pf = pFields-GetItem("COLUMN_NAME");

字段对象有很多有用的属性,这些可以参考我的源代码或其他相关资料.如:get_ActualSize(long *pl)

//实际宽度

get_Attributes(long *pl)

//属性

get_DefinedSize(long *pl) //定义宽度(以字节为单位,如整型为4,长整型为8...)

get_Name(BSTR *pbstr) //字段名

get_Type(DataTypeEnum *pDataType) //数据类型

get_Value(VARIANT *pvar) // 字段的值

有了以上对ADO的基本了解后,我们将正式开始编写应用程序,请看下文。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有