分享
 
 
 

一个简单而又灵活的数据库操作类

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

一个简单而又灵活的数据库操作类作者: 紫瑗

******************************************************************************************************

本文关于 ADO 简介的文字取自 VB 编程乐园 ,特此声明。

适用范围:数据库

适用对象: C++ ,初级

******************************************************************************************************

一、 ADO 简介

ActiveX Data Objects (ADO) 是微软最新的数据访问技术。它被设计用来同新的数据访问层 OLE DB Provider 一起协同工作,以提供通用数据访问( Universal Data Access )。 OLE DB 是一个低层的数据访问接口,用它可以访问各种数据源,包括传统的关系型数据库,以及电子邮件系统及自定义的商业对象。

ADO 向我们提供了一个熟悉的,高层的对 OLE DB 的 Automation 封装接口。对那些熟悉 RDO 的程序员来说,你可以把 OLE DB 比作是 ODBC 驱动程序。如同 RDO 对象是 ODBC 驱动程序接口一样, ADO 对象是 OLE DB 的接口;如同不同的数据库系统需要它们自己的 ODBC 驱动程序一样,不同的数据源要求它们自己的 OLE DB 提供者( OLE DB provider )。目前,虽然 OLE DB 提供者比较少,但微软正积极推广该技术,并打算用 OLE DB 取代 ODBC 。

二、在哪里能得到 ADO?

目前最新版本的已经可以从微软网站免费下载。到目前为止,微软网站仍是你获取有关 ADO 最新信息的最佳场所。 ADO 是作为 OLE DB SDK 的一部分提供的。你可以从下面这个网址下载:

http://www.microsoft.com/data/oledb/download.htm

三、如何使用 ADO

使用 ADO 有许多种方式,最常用的方法是直接使用 Activate 控件中的 Microsoft ADO Data Control ,这样用起来很方便。但是大家可能觉得它也有不少的缺点,比如说用起来不够方便啦,函数的接口都较晦涩难懂等等,总之,就是感觉到不灵活。

今天我为大家介绍一个类,它实质上是对 ADO 的一个包装,使用起来相当灵活。详细代码在附带的压缩包 ado.zip 内。

这个类的作者是 Carlos Antollini ,当前版本为 2.04 ,支持 ado1.5 ,有两个文件,分别为 ado.h 和 ado.cpp 。我仅作了少量改动。

库简介:

这个库主要由 6 个部分组成,分别是 CADOCommand (命令处理), CADODatabase (数据库主体), CADOException (意外处理), CADOFieldInfo (字段值), CADOParameter (参数), CADORecordset (记录集)。其中最主要的就是 CAdoCommand 类, CAdoDatabase 类和 CAdoRecordset 。

要使用这个库,你可能需要安装以下软件(我没有严格测试,所以实际上的情况可能略有出入):

1 , MDAC2.8

2 , Microsoft Visual Studio 6.0

使用方法和范例

下面我会以一个连接 sql server 数据库的例子做示范,逐步展示如何去使用这个库。

第一步,创建一个对话框工程,为主对话框添加如图所示的几个控件

第二步,加入 ado.h 和 ado.cpp ,并且把 MSADO15.DLL 拷到工程 .dsp 所在的目录

第三步,用 access 创建一个数据库,添加一张 account 表,添加几个记录

第四步,修改代码如下:

// 主对话框的头文件

#include "ado.h"

class CAdoDemoDlg : public CDialog

{

// Construction

public:

CAdoDemoDlg(CWnd* pParent = NULL); // standard constructor

// 省略系统代码

private:

// 取当前的值

void GetCurrentVal(void);

// 设置当前窗口的控件的数据

void SetControlData(CString strAccount, CString strNick, int nArticle, int nFlower, int nKnife);

// 初始化数据库

BOOL InitDatabase(void);

CADORecordset m_pRs; // 数据表

CADODatabase m_pDb; // 数据库

int nRecordIndex_; // 当前记录的索引

};

// 主对话框的实现文件

// AdoDemoDlg.cpp : implementation file

CAdoDemoDlg::CAdoDemoDlg(CWnd* pParent /*=NULL*/)

: CDialog(CAdoDemoDlg::IDD, pParent) // 构造函数

{

//… 省略系统代码

nRecordIndex_ =0;

}

BOOL CAdoDemoDlg::OnInitDialog() // 初始化对话框

{

CDialog::OnInitDialog();

//… 省略系统代码

InitDatabase(); // 初始化数据库

GetCurrentVal(); // 取当前的记录值

return TRUE; // return TRUE unless you set the focus to a control

}

void CAdoDemoDlg::OnDestroy() // 关闭窗口的时候,关闭数据库

{

CDialog::OnDestroy();

if(m_pRs.IsOpen())

{

m_pRs.Close();

}

if(m_pDb.IsOpen())

{

m_pDb.Close();

}

}

BOOL CAdoDemoDlg::InitDatabase()

{ // 初始化数据库

//strConnection, 数据库连接串, ado 支持各种连接串

CString strConnection ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\ Workspace\\

AdoDemo\\db.mdb;Persist Security Info=False";

if(!m_pDb.Open(strConnection)) // 打开数据库

{

AfxMessageBox(m_pDb.GetLastErrorString());

return FALSE;

}

m_pRs = CADORecordset(&m_pDb); // 初始化记录集

CString strSQL ="";

strSQL.Format("SELECT * from account");

CADOCommand cmd(&m_pDb, _T(""));

cmd.SetText(strSQL);

cmd.SetType(adCmdText);

if(!m_pRs.Execute(&cmd)) // 使用 SQL 语句生成记录源

{

AfxMessageBox(m_pDb.GetLastErrorString());

return FALSE;

}

return TRUE;

}

void CAdoDemoDlg::SetControlData(CString strAccount, CString strNick, int nArticle, int nFlower, int nKnife)

{ // 设置控件上显示的内容

// 账号

m_Account .SetWindowText(strAccount);

// 昵称

m_Nick .SetWindowText(strNick);

CString strNumText;

// 贴子数

strNumText .Format("%d", nArticle);

m_ArticleCount .SetWindowText(strNumText);

// 鲜花

strNumText .Format("%d", nFlower);

m_Flower .SetWindowText(strNumText);

// 飞刀

strNumText .Format("%d", nKnife);

m_Knife .SetWindowText(strNumText);

}

void CAdoDemoDlg::OnPrev()

{ // 上一步按钮的处理

if(!m_pRs.IsOpen()) // 数据库没打开

return ;

if(m_pRs.IsBOF()) // 到顶了

return ;

if(0 == nRecordIndex_)

return ;

nRecordIndex_ --;

m_pRs.MovePrevious();

GetCurrentVal();

}

void CAdoDemoDlg::OnNext()

{ // 下一步按钮的处理函数

if(!m_pRs.IsOpen()) // 数据库没打开

return ;

if(m_pRs.IsEof() ||

m_pRs.IsBof()) // 到底了

return ;

if(((int)m_pRs.GetRecordCount() - 1) == nRecordIndex_)

return ;

nRecordIndex_ ++;

m_pRs.MoveNext();

GetCurrentVal();

}

void CAdoDemoDlg::GetCurrentVal()

{// 取当前记录的数据

if(!m_pRs.IsOpen()) // 数据库没打开

return ;

CString strAccount;

m_pRs .GetFieldValue(" 账号 ", strAccount, "");

CString strNick;

m_pRs .GetFieldValue(" 昵称 ", strNick, "");

CString strArticleCount;

m_pRs .GetFieldValue(" 发贴数量 ", strArticleCount, "");

CString strFlower;

m_pRs .GetFieldValue(" 鲜花数 ", strFlower, "");

CString strKnife;

m_pRs .GetFieldValue(" 飞刀数 ", strKnife, "");

SetControlData(strAccount, strNick, atoi(strArticleCount), atoi(strFlower), atoi(strKnife));

}

程序说明

这个演示程序很简单,只演示了如何查询一个数据库,其实数据库程序确实没什么很特别,主要是使用 sql 语句作操作就可以了。

程序的重点在三个函数:

1 , BOOL InitDatabase(void)

这个函数初始化了数据库

CString strConnection ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\ Workspace\\

AdoDemo\\db.mdb;Persist Security Info=False";

上面一个语句就生成了一个连接字符串

if(!m_pDb.Open(strConnection))

使用上面产生的语句打开数据库

m_pRs = CADORecordset(&m_pDb);

如果数据库成功打开,则打开这个数据库的表

CString strSQL ="";

strSQL.Format("SELECT * from account");

先生成一个 SQL 语句

CADOCommand cmd(&m_pDb, _T(""));

cmd.SetText(strSQL);

cmd.SetType(adCmdText);

利用 SQL 语句生成操作命令

if(!m_pRs.Execute(&cmd)) // 使用 SQL 语句生成记录源

执行这个操作后,数据表就是有效的了。

2,OnPrev和OnNext是相似的,拿OnPrev来解释就行了

if(!m_pRs.IsOpen()) //数据库没打开

return ;

if(m_pRs.IsBOF()) //到顶了

return ;

上面代码先检查数据库是否有效,已经表指针是否已经到顶了

if(0 == nRecordIndex_)

return ;

nRecordIndex有点特别,其实是一个辅助变量,主要是表头(BOF)和表尾(EOF)跟真实记录间会有一个记

录的间隔,所以使用 nRecordIndex作辅助判断。

nRecordIndex_ --;

向前一个记录, nRecordIndex减1

m_pRs.MovePrevious();

表指针向前移一个记录

GetCurrentVal();

设置当前记录的数据

进阶 关于ado库的原理 :

这个库其实是对于 Microsoft ADO Data Control 一个封装,它的本质还是 Microsoft ADO Data Control 。只是它把这个组件中一些晦涩的功能函数变成一个简单易懂的函数,而且使用起来更灵活。基本上 Microsoft ADO Data Control 能做到的东西,它都能做到, Microsoft ADO Data Control 不方便做的东西,它做起来要更方便一些。以 CADODatabase 类为例,它里面的核心就是: _ConnectionPtr m_pConnection !

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有