基于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是为了将结果显示出来.
感兴趣的读者可以与作者联系.

香港最便宜的vps要多少钱?最便宜的香港vps能用吗?

香港最便宜的vps要多少钱?最便宜的香港vps能用吗?香港vps无需备案,整体性能好,而且租用价格便宜,使用灵活,因为备受站长喜爱。无论是个人还是企业建站,都比较倾向于选择香港VPS。最便宜的香港vps能用吗?正因为有着诸多租用优势,香港VPS在业内颇受欢迎,租用需求量也在日益攀升。那么,对于新手用户来说,香港最便宜的vps租用有四大要点是务必要注意的,还有易探云香港vps租用最便宜的月付仅18元...

WebHorizon($10.56/年)256MB/5G SSD/200GB/日本VPS

WebHorizon是一家去年成立的国外VPS主机商,印度注册,提供虚拟主机和VPS产品,其中VPS包括OpenVZ和KVM架构,有独立IP也有共享IP,数据中心包括美国、波兰、日本、新加坡等(共享IP主机可选机房更多)。目前商家对日本VPS提供一个8折优惠码,优惠后最低款OpenVZ套餐年付10.56美元起。OpenVZCPU:1core内存:256MB硬盘:5G NVMe流量:200GB/1G...

paypal$10的代金券,选购美国VPS

paypal贝宝可撸$10的代金券!这两天paypal出了活动,本次并没有其他的限制,只要注册国区的paypal,使用国内的手机号和62开头的银联卡,就可以获得10美元的代金券,这个代金券购买产品需要大于10.1美元,站长给大家推荐几个方式,可以白嫖一年的VPS,有需要的朋友可以看看比较简单。PayPal送10美元活动:点击直达活动sfz与绑定卡的号码可以重复用 注册的邮箱,手机号与绑的银联卡必须...

vb连接数据库为你推荐
ovOV摄像头是哪个国家的人人时光机现在世界上有时光机吗最新qq空间代码QQ空间代码有哪些???中国电信互联星空电信不明不白收了我200元互联星空信息费 求解拂晓雅阁?英特尔和AMD有什么区别啊?快速美白好方法有什么变白的好方法1433端口怎么开启本机1433端口照片转手绘怎么把图片P成手绘百度手写百度手写显示arm开发板单片机开发板与ARM开发板有什么不同?
虚拟主机控制面板 厦门虚拟主机 vps安全设置 湖南服务器托管 昆明蜗牛家 如何安装服务器系统 东莞主机托管 qq金券 江苏徐州移动 shuangcheng linux命令vi 硬防 回程 极域网 dns是什么意思 冰盾ddos防火墙 隐士ddos 紫田网络 腾讯空间登录首页 电脑主机声音很大 更多