一个简单而又灵活的数据库操作类
一个简单而又灵活的数据库操作类作者: 紫瑗 |
****************************************************************************************************** 本文关于 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 ! |
一个简单而又灵活的数据库操作类相关推荐
- php封装数据库操作类,php简单数据库操作类的封装
本文实例为大家分享了php封装一个简单的数据库操作类,供大家参考,具体内容如下 一.代码 class conndb{ private $local; private $username; privat ...
- php加数据库开发案例,PHP简单数据库操作类实例【支持增删改查及链式操作】
本文实例讲述了PHP简单数据库操作类.分享给大家供大家参考,具体如下: 在进行项目开发时,数据库是必不可少的东西了.但是很多时候却又对数据库SQL语句的繁杂而感到头疼.提供一个我自己使用的数据库操作类 ...
- php pdo 事物类,一个基于PDO的数据库操作类(新) 一个PDO事务实例
/* * 作者:胡睿 * 日期:2011/03/19 * 电邮:hooray0905@foxmail.com * * 20110319 * 常用数据库操作,如:增删改查,获取单条记录.多条记录,返回最 ...
- php pdo oracle操作类,一个基于PDO的数据库操作类
百度之后决定使用PDO,至于为什么选择PDO,这里就不再多说,大家自己去百度下就能明白. 既然要换,那最基本就需要有个常用的数据库操作类,也就是所谓的增删改查等,昨晚捣腾了一晚,大致弄出了个雏形,以下 ...
- PHP操作mongodb数据库操作类
最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb ...
- mysql 数据库操作类_【数据库操作类】10个php操作数据库类下载
数据库(Database)操作是在开发过程中重要的组成部分,熟练掌握数据库的操作是开发人员必备的武器.PHP中文网为大家提供了各种封装好的php数据库操作类库,供大家下载和学习. 相关mysql视频教 ...
- php mysql 数据库操作类_php mysql数据库操作类
分享一个本人一直在使用的一个mysql数据库操作类,比较初级,自己给别人做web网站的时候一直用的这个类,这个也是之前刚开始学习php的时候在网上找到的一个mysql数据库操作类,后来自己改了一些,比 ...
- 基于javascript的asp数据库操作类,含分页、字符串截取、用户登陆验证[原创]
2005.01.15发表于blog.csdn.net/zxub 无聊又用了用asp,发现还是不爽,已经习惯了面向对象了,就想改进了,vbscript不用,感觉看起来很不爽,就用javascript写了 ...
- 一个简单的完成端口(服务端/客户端)类
一个简单的完成端口(服务端/客户端)类 作者:spinoza 翻译:麦子芽儿, POWERCPP(后面部分内容) 下载源代码 原文网址:http://www.codeproject.com/KB/IP ...
最新文章
- python的翻译-用Python做一个简单的翻译工具
- 编程软件python中的if用法-python 函数式编程工具
- gdb 编译make: *** [all] 错误 2_Dev 日志 | Segmentation Fault 和 GCC 编译问题排查
- html相对路径载入页面,html页面的绝对路径和相对路径
- mysql 导入 相对路径,MySQL数据库导出与导入及常见错误解决
- CVPR 2019开源论文 | 基于“解构-重构”的图像分类学习框架
- java技术系列(一) Enum
- R12 应付款模块(AP):预付款(prepayment)的标准处理流程
- HTTP中CORS跨域请求的实现(C++|Qt框架实现)
- 【JAVA】 02-Java对象细节
- vs 2005 多語言
- Java中List, Integer[], int[]的相互转换
- 返回List的分页方法
- Android 百度地图定位显示当前位置
- 最基本财务基础知识,财务知识基础来源
- 开源项目(VC++,MFC)
- 解密-大象跳转如何实现微信中点击链接直接跳到默认浏览器(不是在微信内置浏览器打开)
- 六、路由(routing)
- js动态加载table,打印table里的内容以及解决打印后的问题
- 计算机通信与网络(一)