第9章数据库编程 9.1 数据库概述 9.2 ODBC数据库管理 9.3 数据库相关的ActiveX控件.

Slides:



Advertisements
Similar presentations
第六 章数据库访问页 6.1 数据访问页视图 6.2 创建数据访问页 6.3 编辑数据访问页 6.4 查看数据访问页 退出.
Advertisements

第13章 数据库的基本应用 Visual Basic 程序设计教程.
第8章 数据库编程 Visual C++ 6.0为用户提供了ODBC、DAO及OLE DB三种数据库方式。这三种
第 11 章 数据库编程 11.1 关系数据库模型 11.2 使用ODBC 11.3 使用DAO 返回主目录.
数据库概述 简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在了Oracle、SQL Server、MySQL等诸多优秀的数据库。在这一章中将讲解的内容包括。
插入超链接 高邮市第一实验小学 范太国 任务一:设置文本超链接 任务一:设置文字超链接 步骤:1、选定文字并右击,在快捷菜单 中选择“超链接”命令。 2、在弹出的对话框中选择左侧“链接到:”中的“本文档中的位置(A)”项,在“请选择文档中的位置(C):”中选择需要链接的幻灯片,单击“确定”按钮。
文科计算机小公共课规划教材 Access 程序设计.
Oracle数据库 Oracle 子程序.
数据库管理软件 Access 2003的使用 安丘市职业中专 雷云龙 1.
在PHP和MYSQL中实现完美的中文显示
J2EE与中间件技术 ——Lab.
Database Application Developing
二.資料庫系統建立與管理 Access 資料庫:windows下的單機資料庫 Access 操作 Mysql資料庫介紹.
班級:博、碩子一甲 授課老師:鐘國家 助教:陳國政
第八章 菜单设计 §8.1 Visual FoxPro 系统菜单 §8.2 为自己的程序添加菜单 §8.3 创建快捷菜单.
VB如何存取資料庫 ? 資料庫 資料儲存 資料庫引擎 資料庫引擎 Jet 讀取、寫入與修改 資料控制項 資料庫存取物件(ADO) 使用者介面.
第5章 文本与字体 2018/12/3 面向对象与可视化 程序设计 --Visual C++ 编程 主讲教师: 唐 龙教授 (计算机科学与技术系) 黄维通博士 (计算机与信息管理中心) 清 华 大 学 2001年2月 2018/12/3 Huang Weitong.
第1章 Windows应用程序框架的 创建与消息处理
大学计算机基础 典型案例之一 构建FPT服务器.
SQL Injection.
走进编程 程序的顺序结构(二).
辅导课程六.
MFC WinSock类的编程 为简化套接字网络编程,更方便地利用Windows的消息驱动机制,微软的基础类库(Microsoft Foundation Class Libary,简称MFC),提供了两个套接字类,在不同的层次上对Windows Socket API函数进行了封装,为编写Windows.
第9章数据库应用 9.1数据库和ODBC操作 9.2MFC ODBC应用编程 9.3ADO数据库编程 9.4数据库相关的ActiveX控件
VC++开发实例 张荣梅 2007年2月.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
PostgreSQL 8.3 安装要点 四川大学计算机学院 段 磊
第一讲: 基本流程(1).
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
Hub Web System 主要功能: 1.查询库存(Query Current Storage) 2.创建PL(Create PL) 3.查询、打印PL单(Query & Print PL) 4.查询允交量、在途量 5.修改用户的基本信息(Update Password) 6.查询GR(Query.
第4章 MFC编程 4.1 MFC概述 4.2 MFC和Win CObject类 4.4 消息映射的实现
2019/1/12 GDP设计协同 超级管理员操作手册 GDP项目组.
Windows 7 的系统设置.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
DevDays ’99 The aim of this mission is knowledge..
程序设计工具实习 Software Program Tool
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
SQL Server Mobile 2005 程序开发(三)
SQL 范引娣.
标准配色方案 背景 文本和线条 阴影 强调色 主色一 主色二 主色三 主色四 推荐应用顺序. 标准配色方案 背景 文本和线条 阴影 强调色 主色一 主色二 主色三 主色四 推荐应用顺序.
《面向对象程序设计与Visual C++6.0教程》
VisComposer 2019/4/17.
VB与Access数据库的连接.
计算机网络与网页制作 Chapter 07:Dreamweaver CS5入门
数据库系统与应用实验 基于SQL Server 2005.
第5章 文本与字体 2019/4/25 面向对象与可视化 程序设计 --Visual C++ 编程 主讲教师: 唐 龙教授 (计算机科学与技术系) 黄维通博士 (计算机与信息管理中心) 清 华 大 学 2001年2月 2019/4/25 Huang Weitong.
iSIGHT 基本培训 使用 Excel的栅栏问题
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
VRP教程 2011.
Delphi 7.0开发示例.
SCI收录号查询方法介绍 上海大学情报研究所
Python 环境搭建 基于Anaconda和VSCode.
HOOK和数据库访问 主讲人:孙鑫
第六章 Excel的应用 五、EXCEL的数据库功能 1、Excel的数据库及其结构 2、Excel下的数据排序 (1)Excel的字段名行
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
YOUR SUBTITLE GOES HERE
VB与Access数据库的连接.
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
WEB程序设计技术 数据库操作.
使用ADO访问数据库 李宝智 BonizLee 课程 10564A
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
第六讲 酒店客房管理系统(二) 教育部“十二五”职业教育国家规划教材
培训课件 AB 变频器的接线、操作及参数的备份 设备动力科.
熟悉VC++开发环境.
数据库应用技术 天津电大 翟迎建.
Presentation transcript:

第9章数据库编程 9.1 数据库概述 9.2 ODBC数据库管理 9.3 数据库相关的ActiveX控件

9.1数据库概述 数据库和DBMS 指以一定的组织形式存放在计算机存储介质上的相互关联的数据的集合。 SQL SQL语句分为两类:一是DDL语句,用来创建表、索引等,另一是DML,这些语句是用来读取数据、更新数据和执行其他类似操作的语句。 ODBC、DAO和OLE DB ODBC提供了应用程序接口(API),使得任何一个数据库都可以通过ODBC驱动器与指定的DBMS相联。程序可以通过调用ODBC驱动管理器中相应的驱动程序达到管理数据库的目的。 DAO使用Jet数据库引擎形成一系列的数据访问对象:数据库对象、表和查询对象、记录集对象等。可以打开一个Access数据库文件(MDB文件),也可直接打开一个ODBC数据源以及使用Jet引擎打开一个ISAM(被索引的顺序访问方法)类型的数据源(dBASE、FoxPro、Paradox、Excel或文本文件)。 OLE DB试图提供一种统一的数据访问接口,并能处理除了标准的关系型数据库中的数据之外,还能处理包括邮件数据、Web上的文本或图形、目录服务(Directory Services)以及主机系统中的IMS和VSAM数据。OLE DB提供一个数据库编程COM(组件对象模型)接口,使得数据的使用者(应用程序)可以使用同样的方法访问各种数据,而不用考虑数据的具体存储地点、格式或类型。这个COM接口与ODBC相比,其健壮性和灵活性要高得多。但是,由于OLE DB的程序比较复杂,因而对于一般用户来说使用ODBC和DAO方式已能满足一般数据库处理的需要。

9.2ODBC数据库管理 9.2.1MFC的ODBC过程 设计数据库

9.2ODBC数据库管理 定义ODBC的数据源 图9.1 Windows 98的“控制面板” 图9.2 ODBC数据源管理器

9.2ODBC数据库管理 (2)在该对话框中选 “Microsoft Access Driver”。单击[完成],如图。 定义用户的DSN的过程如下。 (1)单击[添加]按钮,如图。 (2)在该对话框中选 “Microsoft Access Driver”。单击[完成],如图。 (3)在对话框中,单击[选取]按钮将前面创建的数据库调入。 (4)单击[确定],如图。 图9.4 ODBC Access 安装对话框 图9.3 “创建新数据源”对话框 图9.5 用户数据源列表

图9.7 “Database Options”对话框 9.2ODBC数据库管理 MFC Appwizard的创建 (1)用MFC AppWizard(exe)创建一个单文档应用程序Ex_ODBC。 (2)在向导的第二步对话框中加入数据库的支持,如图。 (3)选中“Database view with file support”项,单击[Data Source],如图。 图9.6 向导的第二步对话框 图9.7 “Database Options”对话框

图9.8 “Select Database Tables”对话框 9.2ODBC数据库管理 (4)选择ODBC的数据源“My database for VC”,单击[OK],如图,从中选择要使用的表(这里选择xs)。 (5)单击[OK],回到向导的第二步对话框。单击[Finish]。 (6)编译并运行,如图。 图9.9 Ex_ODBC运行结果 记录浏览按钮 图9.8 “Select Database Tables”对话框

9.2ODBC数据库管理 浏览记录 (1)将前面的单文档项目Ex_ODBC调入。 (2)切换到项目工作区窗口的ResourceView页面,打开用于表单视图CEx_ODBCView的对话框资源IDD_EX_ODBC_FORM。 (3)参看图9.10向对话框中添加下列控件。 图9.10 控件的设计

9.2ODBC数据库管理 (4)选择“View”菜单“Class Wizard”或按快捷键Ctrl+W,切换到Member Variables页面,在Class name框中选择CEx_ODBCView,为上述控件添加相关联的数据成员。例如,双击IDC_PROF_CODE,在弹出的对话框中的成员变量下拉列表中选择要添加的成员变量名m_pSet->m_profcode,如图。 (5)按照上一步骤的方法,为下表的控件依次添加相关联的数据成员。 图9.11 为控件添加数据成员

9.2ODBC数据库管理 (6)编译并运行,如图。 图9.12 Ex_ODBC浏览记录

图9.13 “MFC ClassWizard”对话框 9.2ODBC数据库管理 改变与m_pSet关联的表 (1)将ClassWizard对话框切换到“Member Variables”页面,在“Class name”的下拉列表中选择“CEx_ODBCSet”,此时ClassWizard对话框的[Update Columns和[Bind All按钮被激活。如图。 图9.13 “MFC ClassWizard”对话框

图9.14 “Database Options”对话框 图9.15 “Select Database Tables”对话框 9.2ODBC数据库管理 (2)单击[Update Columns],如图。 (3)从中选择ODBC的数据源“My database for VC”,单击[OK],如图,选择要使用的表。 (4)单击[OK]按钮,以回到ClassWizard界面。 (5)若表中的各个字段还没有相应的数据成员,可单击[Bind All]按钮进行自动设置。 图9.14 “Database Options”对话框 图9.15 “Select Database Tables”对话框

9.2ODBC数据库管理 9.2.2MFC的ODBC类 动态行集和快照集 CRecordset类对象提供了从数据源中提取出表的记录集,并提供了两种操作形式:动态行集(Dynasets)和快照集(Snapshots)。 动态行集能与其他用户所做的更改保持同步,快照集是数据的一个静态视图。这两形式在记录集被打开时都提供一组记录,所不同的是:当在一个动态行集里滚动一条记录时,由其他用户或应用程序中的其他记录集对该记录所做的更改会相应地显示出来,而快照集则不会。 CRecordset类的基本操作 (1)查询记录 使用CRecordset::Open和CRecordset::Requery成员函数可以对表进行记录的查询。注意: 在使用CRecordset类对象之前,必须使用CRecordset::Open函数来获得有效的记录集。一旦已经使用过CRecordset::Open函数,再次查询时就需要应用CRecordset:: Requery()函数进行记录的刷新。 查询过程中,通常利用CRecordset的成员变量m_strFilter和m_strSort来执行条件查询和结果排序。m_strFilter为过滤字符串,存放着SQL语句中WHERE后的条件串;而m_strSort为排序字符串,存放着SQL语句中ORDER BY后的字符串。

9.2ODBC数据库管理 (2)增加记录 增加记录是使用AddNew函数,要求数据库必须是以“可增加”的方式打开的。在表的末尾增加新记录: m_pSet->AddNew(); // 在表的末尾增加新记录 m_pSet->SetFieldNull(&(m_pSet->m_name), FALSE);// 设定m_name字段值不为空(NULL) m_pSet->m_name="李 林"; ...... // 输入新的字段值 m_pSet->Update(); // 将新记录存入数据库 m_pSet->Requery(); // 刷新记录集,这在快照集方式下是必须的 把一个记录加到表中时,应该调用CRecordset::MoveLast。 (3)删除记录 可以直接使用Delete函数来删除记录,并且在调用Delete()函数之后不需调用Update()函数,但要移动当前记录位置以使删除有效。例如: CRecordsetStatus status; m_pSet->GetStatus(status); m_pSet->Delete(); if (status.m_lCurrentRecord==0) m_pSet->MoveNext(); // 下移一个记录 else m_pSet->MoveFirst(); // 移动到第一个记录处 UpdateData(FALSE);

9.2ODBC数据库管理 (4)修改记录 函数Edit可以用来修改记录,例如: m_pSet->Edit(); // 修改当前记录 m_pSet->m_name="刘向东"; // 修改当前记录字段值 ...... m_pSet->Update(); // 将修改结果存入数据库 m_pSet->Requery(); (5)撤消操作 如果在进行增加或者修改记录后,希望放弃当前操作,则可以在调用Update()函数之前调用CRecordset::Move(AFX_MOVE_REFRESH)来撤消增加或修改操作,并恢复在增加或修改模式之前的当前记录。

9.2ODBC数据库管理 9.2.3数据库编程 显示记录总数和当前记录号 GetRecordCount和GetStatus用来获得表中的记录总数和当前记录的索引,原型: long GetRecordCount( ) const; void GetStatus( CRecordsetStatus& rStatus ) const; 参数rStatus是指向下列的CRecordsetStatus结构的对象: struct CRecordsetStatus { long m_lCurrentRecord; // 当前记录的索引,0表示第一个记录, // 1表示第二个记录,依次类推。但-1表示在第 // 一个记录之前,-2表示不确定。 BOOL m_bRecordCountFinal; // 记录总数是否是最终结果 }; 注意,GetRecordCount函数所返回的记录总数在表打开时或调用Requery函数后是不确定的,必须经过下列的代码才能获得最终有效的记录总数: while (!m_pSet->IsEOF()) { m_pSet->MoveNext(); m_pSet->GetRecordCount(); }

9.2ODBC数据库管理 (1)将前面的单文档应用程序Ex_ODBC调入。 (2)打开MainFrm.cpp文件,将indicators数组修改如下: static UINT indicators[] = { ID_SEPARATOR, // 第一个信息行窗格 ID_SEPARATOR, // 第二个信息行窗格 ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; (3) 为CEx_ODBCView类添加OnCommand消息处理函数,增加代码。 BOOL CEx_ODBCView::OnCommand(WPARAM wParam, LPARAM lParam) { CString str; CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd; CStatusBar* pStatus = &pFrame->m_wndStatusBar; if (pStatus) { CRecordsetStatus rStatus; m_pSet->GetStatus(rStatus); // 获得当前记录信息 str.Format("当前记录:%d/总记录:%d",1+rStatus.m_lCurrentRecord, m_pSet->GetRecordCount()); pStatus->SetPaneText(1,str); // 更新第二个窗格的文本 } return CRecordView::OnCommand(wParam, lParam);

9.2ODBC数据库管理 (4)在CEx_ODBCView的OnInitialUpdate函数处添加下列代码: void CEx_ODBCView::OnInitialUpdate() { m_pSet = &GetDocument()->m_ex_ODBCSet; CRecordView::OnInitialUpdate(); // 视图更新并初始化 GetParentFrame()->RecalcLayout(); ResizeParentToFit(); // 根据视图的尺寸重新调整父窗口的大小 while (!m_pSet->IsEOF()) { m_pSet->MoveNext(); m_pSet->GetRecordCount(); } m_pSet->MoveFirst(); (5)在Ex_ODBCView.cpp文件的开始处增加下列语句: #include “MainFrm.h” (6)将MainFrm.h文件中的保护型变量m_wndStatusBar变成公共变量。

9.2ODBC数据库管理 (7)编译并运行,如图。 图9.16 显示记录信息 显示的记录信息

9.2ODBC数据库管理 编辑记录 (1)理解“删除” CRecordset类的成员函数Delete只是将记录进行“逻辑”删除,而不是“物理”删除。逻辑删除的记录还可以恢复,而物理删除则不能。 (2)控件与字段数据成员的相互影响 在MFC创建的数据库处理的应用程序框架中,表的字段总是和系统定义的缺省数据成员相关联。在表单视图CEx_ODBCView中添加一些控件用于记录的浏览,其中控件IDC_STU_ID的成员变量也是CEx_ODBCSet的m_stuid,控件数据成员与字段数据成员必然相互影响。合理利用这些影响能简化编程,例如下面的代码是用来增加记录的: m_pSet->AddNew(); //在表的末尾增加新记录 UpdateData(TRUE); // 将控件中的数据传给字段数据成员 m_pSet->Update(); // 将新记录存入数据库 m_pSet->MoveLast(); // 将当前记录位置定位到最后一个记录 UpdateData(FALSE); // 将字段数据成员的数据传给控件,即在控件中显示

9.2ODBC数据库管理 [例Ex_ODBC] 在表单视图中增加三个按钮:[添加记录]、[修改记录]和[删除记录],如图。单击[添加记录]或[修改记录]将弹出一个如图所示的对话框,在对话框中可以进行数据的添加或修改,单击对话框的[确定]则数据有效。 图9.17 Ex_ODBC的记录编辑 图9.18 “学生表”对话框

9.2ODBC数据库管理 (1)将前面的单文档应用项目Ex_ODBC调入。 (2)切换到项目工作区窗口的ResourceView页面,打开用于表单视图CEx_ODBCView的对话框资源IDD_EX_ODBC_FORM。看图9.17,向表单中添加三个按钮:[添加记录]、[修改记录]和[删除记录]。 (3)添加一个对话框资源,打开属性对话框将其字体设置。 (4)参看图9.18,将表单中的控件复制到对话框中,并将[OK]和[Cancel]按钮的标题分别改为“确 定”和“取 消”。图中具有3D效果的竖直线是用静态图片控件(属性为Frame,Etched)构造的。双击对话框模板或按Ctrl+W快捷键,为对话框资源IDD_STU_TABLE创建一个对话框类CStuDlg。 (5)打开ClassWizard的Member Variables标签,在Class name中选择CStuDlg,选中所需的控件ID号,双击鼠标或单击Add Variables按钮。依次为下列控件增加成员变量。

9.2ODBC数据库管理 (6)切换到ClassWizard的Messsage Maps标签页,为CStuDlg中的控件IDOK增加BN_CLICKED的消息映射,并添加下列代码: void CStuDlg::OnOK() { UpdateData(TRUE); CDialog::OnOK(); } (7)用ClassWizard为CEx_ODBCView类中的三个按钮:IDC_REC_ADD、IDC_REC_EDIT和IDC_REC_DEL增加BN_CLICKED的消息映射,添加代码: void CEx_ODBCView::OnRecAdd() { CStuDlg dlg; if (dlg.DoModal()==IDOK){ m_pSet->AddNew(); m_pSet->m_stuid=dlg.m_StuID; m_pSet->m_name=dlg.m_StuName; m_pSet->m_sex=dlg.m_StuSex; m_pSet->m_profcode=dlg.m_ProfCode; m_pSet->Update(); m_pSet->Requery();

9.2ODBC数据库管理 void CEx_ODBCView::OnRecEdit() { CStuDlg dlg; dlg.m_StuID=m_pSet->m_stuid; dlg.m_StuName=m_pSet->m_name; dlg.m_StuSex=m_pSet->m_sex; dlg.m_ProfCode=m_pSet->m_profcode; if (dlg.DoModal()==IDOK){ m_pSet->Edit(); m_pSet->m_stuid=dlg.m_StuID; m_pSet->m_name=dlg.m_StuName; m_pSet->m_sex=dlg.m_StuSex; m_pSet->m_profcode=dlg.m_ProfCode; m_pSet->Update(); UpdateData(FALSE); } void CEx_ODBCView::OnRecDel() { CRecordsetStatus status; m_pSet->GetStatus(status); m_pSet->Delete(); if (status.m_lCurrentRecord==0) m_pSet->MoveNext(); else m_pSet->MoveFirst();

9.2ODBC数据库管理 (8)在Ex_ODBCView.cpp文件的开始处增加下列语句: #include “StuDlg.h” (9)编译并运行。

9.2ODBC数据库管理 处理多个表 [例Ex_ODBC] 用MFC处理多个表。 (1)选择“View”菜单“ClassWizard”命令或按快捷键Ctrl+W。 (2)单击[Add Class]按钮,从下拉列表中选择“New”。 (3)在弹出的“Add Class”对话框中指定一个CRecordset的派生类,如图。 图9.19 定义新的CRecordset派生类

9.2ODBC数据库管理 (4)单击[OK]按钮,弹出“Database Options”对话框,参看图9.7所示。 (5)选择ODBC的数据源“My database table for VC”,单击[OK],选择要使用的表。 (6)单击[OK]按钮,系统自动生成CCodeSet类所需要的代码。以后在程序中就可以通过CCodeSet类对象来处理表zy。 (7)将工作区窗口切换到ResourceView页面,打开对话框资源IDD_STU_TABLE。参看图9.20,向对话框再添加下表的控件: (8)打开ClassWizard的Member Variables标签,在Class name中选择CStuDlg,选中所需的控件ID号,双击鼠标或单击Add Variables按钮。

9.2ODBC数据库管理 (9)切换到ClassWizard的Messsage Maps标签页,为CStuDlg中增加WM_INITDIALOG的消息映射,添加代码: BOOL CStuDlg::OnInitDialog() { CDialog::OnInitDialog(); CCodeSet codeSet; codeSet.Open(); while (!codeSet.IsEOF()) { m_CodeList.AddString(codeSet.m_profcode); codeSet.MoveNext(); } codeSet.Close(); // 在列表框中查找由m_ProfCode指定的专业代码,若找到则设置当前列表项 // 并调用OnSelchangeList1函数 if (!m_ProfCode.IsEmpty()) { int index=m_CodeList.FindString(-1,m_ProfCode); if (index!=LB_ERR){ m_CodeList.SetCurSel(index); OnSelchangeList1(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE

9.2ODBC数据库管理 (10)用ClassWizard为控件IDC_LIST1增加LBN_SELCHANGE的消息映射,并添加下列代码: void CStuDlg::OnSelchangeList1() { int index=m_CodeList.GetCurSel(); if (index!=LB_ERR) { CString str; m_CodeList.GetText(index,str); // 在记录集中查找profcode字段的值为str的记录 CCodeSet codeSet; codeSet.m_strFilter.Format("profcode='%s'",str); if (codeSet.Open()) { m_Disp.Format("%s %d",codeSet.m_profname,codeSet.m_stuyears); m_ProfCode=str; UpdateData(FALSE); } codeSet.Close();

9.2ODBC数据库管理 (11)在StuDlg.cpp文件的开始处增加下列语句: #include “CodeSet.h” (12)编译并运行。单击[修改记录]按钮时,弹出如图所示的对话框。 图9.20 “学生表”对话框

图9.21 “Components and Controls Gallery”对话框 9.3数据库相关的ActiveX控件 9.3.1使用MSFlexGrid控件 将控件的类添加到项目中 (1)选择“Project”“Add To Project”“Components and Controls...”,弹出“Components and Controls Gallery”对话框,如图。 图9.21 “Components and Controls Gallery”对话框

图9.22 “Microsoft Visual C++”对话框 9.3数据库相关的ActiveX控件 (2)双击“Registered ActiveX Controls”项,列出在Windows 98系统中安装的ActiveX控件。 (3)在列表中找到Micorsoft FlexGrid Control,在该控件双击鼠标。如图,向用户询问是否将此控件插入项目中。 (4)单击[确定]按钮,弹出“Confirm Classes”对话框。 (5)单击[OK]按钮接受所有的类。如图9.23。 (6)单击[Close]按钮关闭“Components and Controls Gallery”对话框。 图9.22 “Microsoft Visual C++”对话框 图9.23 控件工具栏 添加的控件

9.3数据库相关的ActiveX控件 向对话框添加MSFlexGrid控件 [例Ex_ODBC] 在表单对话框IDD_EX_ODBC_FORM中添加一个MSFlexGrid控件。 首先用ClassWizard为刚才添加的MSFlexGrid控件增加一个CMSFlexGrid类成员变量m_MSFGrid。在CEx_ODBCView类的OnInitialUpdate函数体中添加代码: void CEx_ODBCView::OnInitialUpdate() { ... m_pSet->MoveFirst(); m_MSFGrid.SetCols(m_pSet->m_nFields+1 );// 设置网格的最大列数 m_MSFGrid.SetRows(m_pSet->GetRecordCount()+1); m_MSFGrid.SetColWidth(-1,1440); // 将所有的网格都设为相同的列宽。-1表示所有的列,列宽单位为一个点的 // 1/20(一个点是1/72英寸),也就是说,1440刚好为1英寸。 // 定义网格的表头 m_MSFGrid.SetRow(0); m_MSFGrid.SetCol(1); // 定位到(0,1)网格 m_MSFGrid.SetText("学号"); // 设置其显示内容 m_MSFGrid.SetRow(0); m_MSFGrid.SetCol(2); m_MSFGrid.SetText("姓名"); m_MSFGrid.SetRow(0); m_MSFGrid.SetCol(3); m_MSFGrid.SetText("性别"); m_MSFGrid.SetRow(0); m_MSFGrid.SetCol(4); m_MSFGrid.SetText("专业代号"); int iRow=1;

9.3数据库相关的ActiveX控件 while (!m_pSet->IsEOF()) //将表的记录内容显示在网格中 { CString str; str.Format("记录%d",iRow); m_MSFGrid.SetRow(iRow); m_MSFGrid.SetCol(0); m_MSFGrid.SetText(str); m_MSFGrid.SetRow(iRow); m_MSFGrid.SetCol(1); m_MSFGrid.SetText(m_pSet->m_stuid); m_MSFGrid.SetRow(iRow); m_MSFGrid.SetCol(2); m_MSFGrid.SetText(m_pSet->m_name); m_MSFGrid.SetRow(iRow); m_MSFGrid.SetCol(3); m_MSFGrid.SetText(m_pSet->m_sex); m_MSFGrid.SetRow(iRow); m_MSFGrid.SetCol(4); m_MSFGrid.SetText(m_pSet->m_profcode); iRow++; m_pSet->MoveNext(); } m_MSFGrid.SetRow(1); m_MSFGrid.SetCol(1); m_pSet->MoveFirst();

9.3数据库相关的ActiveX控件 上述代码的目的是将m_pSet所关联的表的记录内容显示在MSFlexGrid控件上,如图。

9.3数据库相关的ActiveX控件 9.3.2RemoteData和DBGrid控件 RemoteData控件 RemoteData 控件在远程数据对象 (RDO)和数据识别的被绑定的控件之间提供了接口。通过 RemoteData 控件,能够: 建立起与基于其本身属性的数据源的连接。 创建RDO的结果集。 把当前行的数据传送给相应被绑定的控件。 允许对当前行指针进行定位。 将对被绑定的控件所做的任何更改反传给数据源。 使用时还需要注意的是: (1)由于RemoteData控件一般不需要程序再控制,因此向一个对话框中添加此控件时只需要在对话框中右击鼠标,选择“Insert Active Control”命令,从“Insert Active Control”对话框的控件列表中选择RemoteData控件,单击[OK]。

9.3数据库相关的ActiveX控件 (2)在RemoteData控件属性对话框(图9.26)中,一般需要进行下面几方面的设置: 在“Control(控制)”页面中,从“DataSource”的下拉列表中选择所需要的数据源名。例如前面的用户数据源名“My database for VC”。 在“SQL”编辑框中键入SQL操作语句,例如“SELECT * FROM xs”是检索学生表xs的所有记录。 由于该控件在这里是用于ODBC的联接,因此该控件必须使用ODBC的游标驱动程序(CursorDriver )才能使用联接成功。其方法是在RemoteData控件属性对话框的“All”页面的“CursorDriver”设置为“1-ODBC cursor”。 图9.26 RemoteData控件的属性对话框

9.3数据库相关的ActiveX控件 设置DBGrid控件 在DBGrid控件的属性对话框中,将数据源(DataRource)设置为RemoteData控件IDC_REMOTEDATACTL1就可以了,如图。 在Ex_ODBC的表单对话框IDD_EX_ODBC_FORM中添加RemoteData控件和一个DBGrid控件,并按上述的过程进行操作,如图。 图9.27 DBGrid控件的属性对话框 图9.28 DBGrid控件的结果