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

vb连接数据库  时间:2021-02-26  阅读:()

杨峰唐常杰徐代刚宋晓梅四川联合大学计科系(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是为了将结果显示出来.
感兴趣的读者可以与作者联系.

raksmart:年中大促,美国物理机$30/月甩卖;爆款VPS仅月付$1.99;洛杉矶/日本/中国香港多IP站群$177/月

RAKsmart怎么样?RAKsmart发布了2021年中促销,促销时间,7月1日~7月31日!,具体促销优惠整理如下:1)美国西海岸的圣何塞、洛杉矶独立物理服务器低至$30/月(续费不涨价)!2)中国香港大带宽物理机,新品热卖!!!,$269.23 美元/月,3)站群服务器、香港站群、日本站群、美国站群,低至177美元/月,4)美国圣何塞,洛杉矶10G口服务器,不限流量,惊爆价:$999.00,...

华纳云新人下单立减40元/香港云服务器月付60元起,香港双向CN2(GIA)

华纳云(HNCloud Limited)是一家专业的全球数据中心基础服务提供商,总部在香港,隶属于香港联合通讯国际有限公司,拥有香港政府颁发的商业登记证明,保证用户的安全性和合规性。 华纳云是APNIC 和 ARIN 会员单位。主要提供数据中心基础服务、互联网业务解决方案, 以及香港服务器租用、香港服务器托管、香港云服务器、美国云服务器,云计算、云安全技术研发等产品和服务。其中云服务器基于成熟的 ...

久久网云-目前最便宜的国内,香港,美国,日本VPS云服务器19.9元/月起,三网CN2,2天内不满意可以更换其他机房机器,IP免费更换!。

久久网云怎么样?久久网云好不好?久久网云是一家成立于2017年的主机服务商,致力于为用户提供高性价比稳定快速的主机托管服务,久久网云目前提供有美国免费主机、香港主机、韩国服务器、香港服务器、美国云服务器,香港荃湾CN2弹性云服务器。专注为个人开发者用户,中小型,大型企业用户提供一站式核心网络云端服务部署,促使用户云端部署化简为零,轻松快捷运用云计算!多年云计算领域服务经验,遍布亚太地区的海量节点为...

vb连接数据库为你推荐
雅虎社区福建晋江社区是什么?中国论坛大全安徽论坛都有哪些?网站运营网站运营的工作做什么今日热点怎么删除千牛里面的今日热点怎么取消_?如何建立一个网站要建立一个网站怎么弄啊?godaddygodaddy域名怎样使用数据库损坏数据库损坏是怎么回事啊?ejb开发什么是ejb?安全漏洞什么是安全漏洞攻击??网管工具做技术网管需要哪些工具?具体做些什么?
免费申请域名和空间 a2hosting 便宜服务器 softlayer 新加坡服务器 linode代购 gateone 12u机柜尺寸 国内加速器 最好的qq空间 彩虹云 申请网站 外贸空间 789 web应用服务器 日本代理ip 畅行云 域名转入 云服务是什么意思 免备案cdn加速 更多