基于VC平台的数据存取对象(DAO)技术(1)

messagebox  时间:2021-01-29  阅读:()

杨峰唐常杰徐代刚宋晓梅四川联合大学计科系(610064)摘要:数据访问对象(DAO)使用MicrosoftJet数据库引擎,可访问MicrosoftAccess数据库,ODBC数据源,以及其他可安装的ISAM数据库.
在VC平台上有灵活的DAO编程方法.
MFC将DAO类封装其中.

VC是强大而灵活的编程语言.
常常需要在VC中直接对数据库中的数据进行查询等操作.
本文介绍使用数据存取对象(DAO)连接数据库的技术,并通过实例对细节加以说明.

1DAO可访问的数据库DAO使用MicrosoftJet数据库引擎可访问MicrosoftAccess(.
MDB)数据库,ODBC数据源,使用一个ODBC驱动器,以及其他可安装的ISAM数据库,如dBase,Paradox,FoxPro,Btrieve等等.
2DAO编程的三种方法(1)采用DAOOLEAutomation接口:DAO为OLEAutomation提供了一个基于vtable的应用接口.
DAOSDK提供了描述DAO的vtable接口的头文件,因此不需要再通过IDispatch机制编程.

当创建了一个DBEngine对象实例后,对象的实例是通过父类来创建.
否则,这些对象就是典型的OLEComponentObjectModel(COM)对象.
因此,应用程序需要负责释放这些对象的空间.
(2)dbDAO类:用VB开发DAO接口非常简单并且需要很少的OLECOM知识.
dbDAO类支持对象的动态分配空间和回收空间,可能的情况下,它还采用自带的C++数据类型,或标准的OLE变量.
它不需要精通C++,调用其函数的语法同VB中的调用相似.

它支持直接在数据结构中读取大量数据.
(3)采用MFCDAO类:用VC++编程,DAO的功能是通过MFC完成的.
基于CRecordset类的代码是为ODBC开发的,其派生类CDAORecordset类在继承了全部数据库功能的同时,增加了更完整的数据库功能.

此外,DAO还可通过ODBC访问其他类型的数据库.
用户可以直接调用VC++4.
0版本中所包含的DAO以及DAOSDK.
3MFC所封装的DAO类CDaoWorkspace该类对应于DAO中的工作台,为用户定义一个对话.
它包含打开的数据库,并提供同时处理机制.
CDaoDatabase该类对应于DAO中的数据库,它代表与数据库的连接,比ODBC数据库类有更强的能力去操纵数据库,可以直接读取MicrosoftJet的.
MDB文件.
CDaoTableDef该类对应于DAO中的Tabledef(表定义),表示一个表的模式(结构),使用SQL的DataManipulationLanguage(DML)子集来生成并操纵数据库中的表.
CDaoQueryDef该类对应于DAO中的Querydef(查询定义).
用户所生成的大多数应用程序只需要数据库记录的一个子集.
Querydef对象表示用户生成并运行的查询,或者用来生成记录集合,按要求过滤和排序记录.

CDAORecordset该类对应于DAO中的记录集合,它代表从数据源中选择的记录集合.
记录集合可以代表从一个或多个数据库表的行中所选择的一个或多个特定的列(栏).

CDaoException该类对应于DAO中的异常处理类.
CDaoFieldExchange该类不是MFC特有的,它管理着数据库中的记录与recordset中的字段变量之间的数据交换.

通过上述类,MFC封装了DAO的各种功能.
下面,通过两个VC5.
0做的简单数据库应用程序,阐明VC+DAO+DB的技术.
4示例例1一个简单的查询修改程序.
设已经用Access建立如下数据库ENROLL.
MDB,其中有表:Teacher和Student,如图1.
表TeacherTeacherNameCourseNameHoursTangGraphics4TangMath6WangAlgorithm3ZhangC++4表StudentStudentNoStudentNameClass1005ZhaoAlgorithm1002QianAlgorithm1002SunC++1009LeeC++图1两个数据库表本程序欲显示如下SQL语句的查询结果:SELECT*FROMTeacher,StudentWHERETeacher.
CourseName=Student.
Class用VC的AppWizard新建一个Project:MyDAO1.
在AppWizard-step2(数据库选项页)中,选择"Databaseviewwithoutfilesupport"选项,单击DataSource按钮,在DatabaseOptions对话框中选择ENROLL.
MDB,然后选择Teacher和Student表.
AppWizard将使用Dynaset作为缺省的记录集合类型,同时选择DirtyFields以检测数据是否改变.
其余选项皆取默认值.
按CTRL-W进入ClassWizard,选择MemberVariables页,可以发现其中各字段皆已被赋以成员变量名,比如TeacherName字段为m_pSet->m_TeacherName,CourseName字段为m_pSet->m_CourseName,Hours对应m_pSet->m_Hours.
然后,在ResourceView页中单击Dialog,选择IDD_MYDAO_FORM对话框,设计对话模板.
向其中加入一个EditBox,按住CTRL键后,双击该编辑框,在MemberVariableName中选择m_TeacherName,表示该栏将为教师名称字段.
对另外四个字段进行同样的操作.
可得到如图2的对话框.

下面加入SQL语句.
在FileView中,选择MyDAO1Set.
cpp,修改成员函数GetDefaultSQL()为:CStringCMyDao1Set::GetDefaultDBName(){return_T("SELECT*FROM[Student],[Teacher]""WHERE[Teacher].
CourseName=[Student].
Class");}编译、链接后运行,将看到表中的单个记录显示在屏幕上.
单击图标中的箭头,还可改变当前记录.
这样,一个简单的数据库查询应用程序就完成了.

图2例2:本程序将显示Student表中的所有记录,其功能相当于Xbase中的LIST命令.

按CTRL-N新建一个Workspace:MyDAO2,在step1中选择SingleDocument,在Step2of6中选择None,在Step6of6中单击CMyDAO2View,在BaseClass中选择CListView,其余都采用默认值.
在ClassView中,对MyDAO2Classes单击鼠标右键,选择NewClasses,ClassType定义为GenericClass,ClassName定义为CCrack.
再对MyDAO2Classes单击鼠标右键,增加一个新类,ClassType定义为MFCClasses,类名为CListCtrlEx,其基类为CListCtrl.
对CMyDAO2Doc单击鼠标右键,增加CMyDAO2View*m_pListView变量,和CDaoDatabase*m_pDB变量;再增加对ID_FILE_OPEN命令的事件处理函数:voidOnFileOpen().
其中,OnFileOpen()函数的功能是打开enroll.
mdb数据库.
同时,在CMyDAO2Doc.
h文件前面加上classCMyDAO2Doc;classCListCtrlEx;#include"afxdao.
h"程序主要部分如下:CMyDao2Doc::CMyDao2Doc(){m_pDB=NULL;m_pListView=NULL;//将两个变量置为NULL.
}CMyDao2Doc::~CMyDao2Doc(){if(m_pDB){//在析构函数中删除指针变量.
if(m_pDB->IsOpen())m_pDB->Close();deletem_pDB;}}BOOLCMyDao2Doc::OnNewDocument(){//对m_pListView变量进行初始化if(!
CDocument::OnNewDocument())returnFALSE;POSITIONpos=GetFirstViewPosition();CView*pView=GetNextView(pos);m_pListView=DYNAMIC_DOWNCAST(CMyDao2View,pView);returnTRUE;}voidCMyDao2Doc::OnFileOpen(){LPCTSTRlpszPathName;lpszPathName="enroll.
mdb";//自动打开所需的数据库文件CDaoDatabase*tmpDB=newCDaoDatabase;try{tmpDB->Open(lpszPathName);}catch(CDaoException*e){deletetmpDB;e->Delete();returnFALSE;}//如果有错,则删除指针并返回if(m_pDB){if(m_pDB->IsOpen())m_pDB->Close();deletem_pDB;}//关闭数据库m_pDB=tmpDB;m_pListView->m_pDB=m_pDB;m_pListView->ListTableData();//显示Student表returnTRUE;}对CMyDAO2View单击鼠标右键,增加CDaoDatabase*m_pDB变量;再添加voidListTableData(LPCTSTRstrTableName)和voidAddItem(intnItem,intnSubItem,LPCTSTRstrItem)两个函数.
再对CMyDAO2View单击鼠标右键,在AddWindowsMessageHandler中,选择WM_CREATE,增加对OnCreate()事件的处理函数.
其中,ShowTableData()函数是显示的主控程序,而每读出一条记录都通过AddItem()函数将其添加到ListView中.
同时,在MyDAO2View.
h应前面加入以下语句:#includeclassCListCtrlEx;classCMyDao2View;程序主要部分如下:intCMyDao2View::OnCreate(LPCREATESTRUCTlpCreateStruct){lpCreateStruct->style|=LVS_REPORT;//用报表的方式显示数据if(CListView::OnCreate(lpCreateStruct)==-1)return-1;return0;}voidCMyDao2View::ListTableData(){ASSERT(m_pDB);ASSERT(m_pDB->IsOpen());CListCtrlEx&ctlList=(CListCtrlEx&)GetListCtrl();CDaoFieldInfofieldInfo;intnFields;CDaoTableDeftd(m_pDB);try{strTableName="Student";td.
Open(strTableName);nFields=td.
GetFieldCount();for(intj=0;jDelete();}td.
Close();CDaoRecordsetrs(m_pDB);intnItem=0;intnLoaded=0;BOOLMAXRECORDS=100;//可读取的最大记录数try{CStringstrSelect(_T("Select*From[Student]自动显示Student表rs.
Open(dbOpenDynaset,strSelect);while(!
rs.
IsEOF()){if(nItemDelete();return;}if(nItem>=MAXRECORDS)MessageBox(strRecCount);//提示记录数太多rs.
Close();//关闭数据库}voidCMyDao2View::AddItem(intnItem,intnSubItem,LPCTSTRstrItem){CListCtrlEx&ctlList=(CListCtrlEx&)GetListCtrl();ctlList.
AddItem(nSubItem,1,strItem);}编译、链接后运行,将看到enroll.
mdb的Studnet表中的全部记录显示在屏幕上.
如图3所示.

图3由于Crack.
cpp和ListCtrlEx.
cpp源程序较长,限于篇幅,不能在此一一列出.
Crack用于读出每一个字段内容,ListCtrlEx是为了将结果显示出来.
感兴趣的读者可以与作者联系.

Nocser:马来西亚独立服务器促销$60.00/月

Nocser刚刚在WHT发布了几款促销服务器,Intel Xeon X3430,8GB内存,1TB HDD,30M不限流量,月付$60.00。Nocser是一家注册于马来西亚的主机商,主要经营虚拟主机、VPS和马来西亚独立服务器业务,数据中心位于马来西亚AIMS机房,线路方面,AIMS到国内电信一般,绕日本NTT;联通和移动比较友好,联通走新加坡,移动走香港,延迟都在100左右。促销马来西亚服务器...

IntoVPS:按小时计费KVM月费5美元起($0.0075/小时),6个机房可选

IntoVPS是成立于2004年的Hosterion SRL旗下于2009年推出的无管理型VPS主机品牌,商家提供基于OpenStack构建的VPS产品,支持小时计费是他的一大特色,VPS可选数据中心包括美国弗里蒙特、达拉斯、英国伦敦、荷兰和罗马尼亚等6个地区机房。商家VPS主机基于KVM架构,最低每小时0.0075美元起($5/月)。下面列出几款VPS主机配置信息。CPU:1core内存:2GB...

PacificRack(19.9美元/年)内存1Gbps带vps1GB洛杉矶QN机房,七月特价优惠

pacificrack怎么样?pacificrack商家发布了七月最新优惠VPS云服务器计划方案,推出新款优惠便宜VPS云服务器采用的是国产魔方管理系统,也就是PR-M系列,全系基于KVM虚拟架构,这次支持Windows server 2003、2008R2、2012R2、2016、2019、Windows 7、Windows 10以及Linux等操作系统,最低配置为1核心2G内存1Gbps带宽1...

messagebox为你推荐
法兰绒和珊瑚绒哪个好珊瑚绒和法兰绒哪个暖和等额本息等额本金哪个好到底是等额本息好还是等额本金好?YunOSyunos是什么手机铁通dns服务器地址桂林铁通DNS服务器地址是多少?广东联通网上营业厅怎么在联通网上营业厅查询自己的“宽带信息”?电影票在哪买便宜在哪买电影票最便宜便宜英文便宜的所有英语单词便宜的智能手机便宜的智能手机有哪些?订机票最便宜的网站订机票最便宜的网站,且可以在线预订机票,使用电子客票?便宜又好的手机收又便宜又好的手机
域名网站 我的世界服务器租用 域名查询工具 域名主机管理系统 高防dns virpus shopex空间 qq数据库 网站挂马检测工具 台湾谷歌网址 七夕促销 联通网站 阿里云邮箱登陆地址 乐视会员免费领取 亿库 .htaccess fatcow godaddy中文 美国服务器 服务器操作系统 更多