



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于VC平台的数据存取对象(DAO)技术(1)杨峰 唐常杰 徐代刚 宋晓梅四川联合大学计科系(610064)4摘要:数据访问对象(DAO) 使用Microsoft Jet数据库引擎,可访问Microsoft Access 数据库,ODBC数据源,以及其他可安装的ISAM数据库。在VC平台上有灵活的DAO编程方法。MFC将DAO类封装其中。VC是强大而灵活的编程语言。常常需要在VC中直接对数据库中的数据进行查询等操作。本文介绍使用数据存取对象(DAO)连接数据库的技术,并通过实例对细节加以说明。1 DAO可访问的数据库DAO 使用Microsoft Jet数据库引擎可访问Microsoft Access (.MDB) 数据库,ODBC数据源,使用一个ODBC驱动器,以及其他可安装的ISAM数据库,如dBase, Paradox, FoxPro, Btrieve等等。 2 DAO编程的三种方法(1)采用DAO OLE Automation接口: DAO为OLE Automation提供了一个基于vtable的应用接口。DAO SDK提供了描述DAO的vtable接口的头文件,因此不需要再通过IDispatch机制编程。 当创建了一个DBEngine对象实例后,对象的实例是通过父类来创建。否则,这些对象就是典型的 OLE Component Object Model (COM) 对象。因此,应用程序需要负责释放这些对象的空间。 (2)dbDAO类: 用 VB开发 DAO接口非常简单并且需要很少的 OLE COM 知识。 dbDAO类支持对象的动态分配空间和回收空间,可能的情况下,它还采用自带的C+ 数据类型,或标准的OLE变量。它不需要精通C+,调用其函数的语法同VB中的调用相似。 它支持直接在数据结构中读取大量数据。(3)采用MFC DAO类: 用VC+ 编程, DAO的功能是通过MFC 完成的。基于CRecordset 类的代码是为ODBC开发的, 其派生类CDAORec *注:国家自然科学基金69773051资助项目 作者简介:杨峰 徐代刚 宋晓梅 四川联合大学计科系96级研究生。唐常杰 四川联大教授。研究方向是数据库与知识库。E-MAIL地址为ordset类在继承了全部数据库功能的同时,增加了更完整的数据库功能。此外,DAO还可通过ODBC访问其他类型的数据库。用户可以直接调用VC + 4.0版本中所包含的DAO以及DAO SDK。3 MFC所封装的DAO类(1) CDaoWorkspace该类对应于DAO中的工作台,为用户定义一个对话。它包含打开的数据库, 并提供同时处理机制。(2) CDaoDatabase该类对应于DAO中的数据库,它代表与数据库的连接,比ODBC数据库类有更强的能力去操纵数据库,可以直接读取Microsoft Jet的 .MDB文件。(3) CDaoTableDef 该类对应于DAO中的Tabledef (表定义),表示一个表的模式(结构),使用SQL的Data Manipulation Language (DML) 子集来生成并操纵数据库中的表。(4) CDaoQueryDef 该类对应于DAO中的Querydef (查询定义)。用户所生成的大多数应用程序只需要数据库记录的一个子集。Querydef对象表示用户生成并运行的查询,或者用来生成记录集合,按要求过滤和排序记录。(5) CDAORecordset 该类对应于DAO中的记录集合,它代表从数据源中选择的记录集合。记录集合可以代表从一个或多个数据库表的行中所选择的一个或多个特定的列(栏)。(6) CDaoException 该类对应于DAO中的异常处理类。(7) CDaoFieldExchange 该类不是MFC特有的,它管理着数据库中的记录与recordset中的字段变量之间的数据交换。通过上述类,MFC封装了DAO的各种功能。下面,通过两个VC 5.0做的简单数据库应用程序,阐明VC+DAO+DB的技术。4 示例例1一个简单的查询修改程序。设已经用Access建立如下数据库ENROLL.MDB,其中有表:Teacher和 Student, 如图1。表 TeacherTeacherNameCourseNameHoursTangGraphics4TangMath6WangAlgorithm3ZhangC+4表 StudentStudentNoStudentNameClass1005ZhaoAlgorithm1002QianAlgorithm1002SunC +1009LeeC +图1 两个数据库表本程序欲显示如下SQL语句的查询结果:SELECT * FROM Teacher, StudentWHERE Teacher . CourseName = Student . Class用VC的AppWizard新建一个Project:MyDAO1。在AppWizard - step2 (数据库选项页)中, 选择“Database view without file support” 选项,单击Data Source按钮,在Database Options对话框中选择ENROLL.MDB,然后选择Teacher 和 Student 表。AppWizard将使用Dynaset作为缺省的记录集合类型,同时选择Dirty Fields以检测数据是否改变。其余选项皆取默认值。按CTRL-W进入ClassWizard, 选择Member Variables页,可以发现其中各字段皆已被赋以成员变量名,比如TeacherName字段为m_pSet- m_TeacherName, CourseName字段为m_pSet- m_CourseName, Hours对应m_pSet- m_Hours。然后,在ResourceView页中单击Dialog,选择IDD_MYDAO_FORM对话框,设计对话模板。向其中加入一个Edit Box,按住CTRL键后,双击该编辑框,在Member Variable Name中选择m_TeacherName,表示该栏将为教师名称字段。对另外四个字段进行同样的操作。可得到如图2的对话框。下面加入SQL语句。在FileView中,选择MyDAO1Set.cpp, 修改成员函数GetDefaultSQL() 为:CString CMyDao1Set:GetDefaultDBName()return _T(SELECT * FROM Student,Teacher WHERETeacher.CourseName=Student.Class );编译、链接后运行,将看到表中的单个记录显示在屏幕上。单击图标中的箭头,还可改变当前记录。这样,一个简单的数据库查询应用程序就完成了。图2例2:本程序将显示Student表中的所有记录,其功能相当于Xbase中的LIST命令。按CTRL-N新建一个Workspace:MyDAO2, 在step 1中选择Single Document, 在Step 2 of 6中选择None, 在Step 6 of 6中单击CMyDAO2View,在Base Class中选择CListView,其余都采用默认值。在ClassView中,对MyDAO2 Classes单击鼠标右键,选择New Classes, Class Type定义为Generic Class, Class Name定义为CCrack。再对MyDAO2 Classes单击鼠标右键,增加一个新类,Class Type定义为MFC Classes,类名为CListCtrlEx,其基类为CListCtrl。对CMyDAO2Doc单击鼠标右键,增加CMyDAO2View* m_pListView变量,和CDaoDatabase* m_pDB变量;再增加对ID_FILE_OPEN 命令的事件处理函数: void OnFileOpen()。其中,OnFileOpen() 函数的功能是打开enroll.mdb数据库。同时,在CMyDAO2Doc.h文件前面加上class CMyDAO2Doc;class CListCtrlEx;#include “afxdao.h”程序主要部分如下:CMyDao2Doc:CMyDao2Doc()m_pDB = NULL;m_pListView = NULL;/将两个变量置为NULL。CMyDao2Doc:CMyDao2Doc()if(m_pDB)/在析构函数中删除指针变量。if(m_pDB-IsOpen()m_pDB-Close();delete m_pDB;BOOL CMyDao2Doc:OnNewDocument()/对m_pListView变量进行初始化if (!CDocument:OnNewDocument()return FALSE;POSITION pos = GetFirstViewPosition();CView* pView = GetNextView(pos);m_pListView = DYNAMIC_ DOWNCAST ( CMyDao2View, pView);return TRUE;void CMyDao2Doc:OnFileOpen() LPCTSTR lpszPathName;lpszPathName = “enroll.mdb”;/自动打开所需的数据库文件CDaoDatabase* tmpDB = new CDaoDatabase;trytmpDB-Open(lpszPathName);catch (CDaoException* e)delete tmpDB; e-Delete();return FALSE;/如果有错,则删除指针并返回if (m_pDB)if (m_pDB-IsOpen()m_pDB-Close();delete m_pDB;/关闭数据库m_pDB = tmpDB;m_pListView-m_pDB = m_pDB;m_pListView-ListTableData( );/显示Student表return TRUE;对CMyDAO2View单击鼠标右键,增加CDaoDatabase* m_pDB变量;再添加void ListTableData(LPCTSTR strTableName) 和void AddItem(int nItem,int nSubItem,LPCTSTR strItem) 两个函数。再对CMyDAO2View 单击鼠标右键,在 Add Windows Message Handler 中,选择 WM_CREATE, 增加对 OnCreate() 事件的处理函数。其中,ShowTableData()函数是显示的主控程序,而每读出一条记录都通过AddItem() 函数将其添加到ListView中。同时,在MyDAO2View.h应前面加入以下语句:#include class CListCtrlEx;class CMyDao2View;程序主要部分如下:int CMyDao2View : OnCreate ( LPCREATESTRUCT lpCreateStruct) lpCreateStruct-style |= LVS_REPORT; /用报表的方式显示数据if (CListView:OnCreate(lpCreateStruct) = -1)return -1;return 0;void CMyDao2View : ListTableData ( )ASSERT(m_pDB);ASSERT(m_pDB-IsOpen();CListCtrlEx& ctlList = (CListCtrlEx&) GetListCtrl();CDaoFieldInfo fieldInfo;int nFields;CDaoTableDef td(m_pDB);trystrTableName = “Student”;td.Open(strTableName);nFields = td.GetFieldCount();for (int j=0; j Delete(); td.Close();CDaoRecordset rs(m_pDB);int nItem = 0;int nLoaded = 0;BOOL MAXRECORDS = 100;/可读取的最大记录数try CString strSelect(_T( Select * From Student ); /自动显示Student表rs.Open(dbOpenDynaset,strSelect);while (!rs.IsEOF() if (nItem MAXRECORDS)nLoaded+;COleVariant var;for (int i=0; i Delete();return;if (nItem=MAXRECORDS)MessageBox(strRecCount); /提示记录数太多rs.Close();/关闭数据库void CMyDao2View:AddItem(int n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 魔术画我的飞天梦课件
- 济南市2025-2026学年八年级下学期语文期中模拟试卷
- 高速供配电基础知识培训课件
- XXXX年国企学习教育自评报告范文
- 电能电功电功率课件
- 电网急救知识培训新闻稿课件
- 电线维修知识培训课件
- 河南省洛阳市老城区2022-2023学年九年级上学期1期中化学试题(含答案)
- 电焊面罩产品知识培训
- 新解读《GB-T 30996.3-2018信息技术 实时定位系统 第3部分:433MHz空中接口协议》
- 统编语文教材八年级上册第三单元整体设计
- JG/T 270-2010工业构筑物水泥基耐磨材料
- 护士转行病案管理制度
- 网络协议分析实践试题及答案
- 企业往来款协议书
- 数学-“问题解决策略:转化”教案 2024-2025学年北师大版七年级数学下册
- 征收房屋转让协议书
- 2025山东中考:生物高频考点
- DB65T 4815-2024 清洗消毒中心内畜禽及其产品运输车辆消毒技术规范
- 上海世博轴及地下综合体工程施工组织设计
- 液化天然气码头设计规范JTS 165-5-2021
评论
0/150
提交评论