用MFC ODBC操作Access数据库

摘 要:本文简要介绍了MFC ODBC的工作原理,并且通过一个应用实例,讨论了利用MFC ODBC技术实现对Access数据源的显示,在此基础上,分析了如何设计以达到利用MFC ODBC来实现修改、增加、删除Access数据源中的记录的功能。

  关键词:VC; MFC ODBC;Access;数据库

  MFC ODBC数据库简述

  开放数据互连(Open Database Connectivity,简称ODBC)是一种数据库的互操作平台,通过经严格定义的各个级别的ODBC接口和客户系统的初始装置,能够为应用程序提供数据库类型透明性和位置透明性,让应用程序的编写者避免了与数据源相联的复杂性。MFC的数据库扩展部分封装了使用ODBC数据资源的细节,应用程序可以直接使用MFC中的数据库扩展类,来操纵ODBC驱动程序管理器,访问数据库。进行MFC ODBC数据库开发时,所需的基础工具就是MFC ODBC数据库类的使用。利用MFC ODBC开发就是利用MFC ODBC数据库类来操纵ODBC数据源。Visual C++的大多数ODBC访问是通过MFC来完成的。Visual C++的MFC类库定义了几个数据库类,在利用MFC编程时常常用到,它们是CDatabase(数据库类)、CRecordSet(记录集类)、和CRecordView(可视记录集类)。

  对于MFC ODBC数据库类来说,CDatabase类对象表示一个同数据源的连接,通过它可以对数据源进行操作。而CRecordSet对象代表从数据源中选择的一组记录的集合,也就是通常所说的记录集对象。

  CRecordSet对象通常用于两种形式:动态集(dynasets)和快照集(snapshots)。动态集能与其他用户所做的更改保持同步,快照集则是数据的一个静态视图。每一种形式在记录被打开时都提供一组记录,区别在于,当用户在一个动态集里滚动到一条记录时,有其他用户或是应用程序中的其他记录集所做的更改就会相应地显示出来。CRecordView类对象能以控制的形式显示数据库记录。这个视图是直接连接到一个CRecordSet对象的表视图。

  一个应用实例

  本实例是某项目中的一部分,目的是实现MFC ODBC数据库与Access数据表格之间的相互操作。包括用Visual C++中的MFC ODBC技术实现对Access数据表格的内容的显示、添加、修改和删除的功能。

  1、 ODBC数据源的创建

  笔者使用的操作系统为Windows XP,工具是Visual C++6.0。此例中建立的Access表格取名为“plc”。

  在“控制面板”中双击“管理工具”图标,然后在新出现的窗口中双击“数据源(ODBC)”,在弹出的对话框中选中“用户DSN”中的“dBASE Files”,单击“添加”按钮,从弹出的对话框中选中“Microsoft Access Driver(*.mdb)”。单击“完成”后,将弹出一个新的对话框,在数据源名及说明后的编辑框中填入表格名“plc”。

  在命名数据源之后,需要把它连接到一个数据库。单击“选择”,如图1所示,得到存储在数据目录中plc.mdb的拷贝文件,选中之,单击“确定”关闭此对话框。然后单击“确定”,完成数据源的创建。


2、 使用AppWizard创建一个数据库应用程序

  笔者开始从AppWizard开始创建一个新的MFC AppWizard(exe)项目。命名为Jh,然后遵从以下步骤:

  1) 在MFC AppWizard第一步对话框中,选择“单个文档”。

  2) 在MFC AppWizard第二步对话框中,选择“查看数据库不使用文件支持”,再单击“Data Source”。

  3)在RecordSet Type组框中,选择Dynaset。在Data Source组框中,单击ODBC单选按钮,然后从下拉列表中选择plc,如图2所示,单击ok,在弹出的新的对话框中选中message,即为本项目所要操作的表。



  以后几步接收缺省值,单击“完成”即可。至此,已创建一个应用程序,并且在程序中自行生成一个数据源和数据源中的一个表的相关程序,其程序清单如下:

class CJhSet : public Crecordset//基于CRecordset的CjhSet新类
{
 public:
  CJhSet(CDatabase* pDatabase = NULL);
  DECLARE_DYNAMIC(CJhSet)
  // Field/Param Data
  //{{AFX_FIELD(CJhSet, CRecordset)
  //对应表中一些被绑定字段的变量
  CString m_baudrate;
  CString m_type;
  CString m_unit;
  CString m_number;
  CString m_address;
  CString m_istart;
  CString m_iend;
  CString m_ostart;
  CString m_oend;
 //}}AFX_FIELD
 // Overrides
 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CJhSet)
 public:
  virtual CString GetDefaultConnect(); // 返回被连接的数据源名称
  virtual CString GetDefaultSQL(); // 返回数据源中所选表名称
  virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support
//}}AFX_VIRTUAL
// Implementation
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif};


  3、 实现程序的显示记录的功能

  一旦AppWizard完成编写这些文件,它将启动对话框编辑器,这样就可以设计自己的表单了。CRecordView应用程序围绕着充当应用程序主窗口的对话框而创建。笔者也将使用像表单一样的对话框来显示存储在plc数据库记录域中的值。如图3所示来放置静态文本框与编辑文本框。



  CJHSet类的成员变量如图4所示。所有的变量均为CString对象。由AppWizard创建的每个变量的类型一般与相应数据库域的类型相似。除了创建成员变量,AppWizard还编写了一组数据交换函数——类似于对话框的DDX函数——来在用来显示信息的控件与定义于CRecordSet类中的数据库域之间交换信息。



  为了实现数据传输,就要把每个控件与代表数据库域的CJHSet变量联系起来。笔者通过使用CJHView来成员变量m_pSet来指向应用程序的CJHSet对象。选择每个资源ID(笔者这里未修改编辑框的默认ID),并单击Add Variable,从下拉表中直接选择相应的成员变量名。全部设置好之后单击OK,至此,运行程序,就可以实现简单的与数据库之间的数据显示功能。

4、 实现程序的添加、修改和删除记录的功能

  在实现上述功能之前,需要按“插入->资源->DIALOG->新建”建立一个新的对话框(与图1所示对话框类似),以建立添加、修改的对象。并为此对话框建立一个基于CDialog基础类的新的类CAddDlg。其ID为IDD_DIALOG1。

  然后在JhView.cpp中加“#include "AddDlg.h"”,并为“添加记录(IDC_ADD)”键编写程序代码如下。其中已经作了详细的注解。

void CJhView::OnAdd()
{
 //建立一个新的添加对话框
 CAddDlg dlg;
 if(dlg.DoModal()==IDOK)
 {
  //增加一条新的记录
  m_pSet->AddNew();
  //把对话框中的记录传递到记录集中
  m_pSet->m_baudrate=dlg.m_br;
  m_pSet->m_type=dlg.m_ty;
  m_pSet->m_unit=dlg.m_un;
  m_pSet->m_number=dlg.m_nu;
  m_pSet->m_address=dlg.m_add;
  m_pSet->m_istart=dlg.m_is;
  m_pSet->m_iend=dlg.m_ie;
  m_pSet->m_ostart=dlg.m_os;
  m_pSet->m_oend=dlg.m_oe;

  m_pSet->Update(); //把新的记录存在数据源里
  m_pSet->MoveLast(); //指定当前记录为最后一条记录
  UpdateData(false); //清空已输入内容
 }
}

  添加记录部分,应该先读出当前的记录,使其显示在添加/修改对话框中,即:

dlg.m_br=m_pSet->m_baudrate;
dlg.m_ty=m_pSet->m_type;
dlg.m_un=m_pSet->m_unit;
dlg.m_nu=m_pSet->m_number;
dlg.m_add=m_pSet->m_address;
dlg.m_is=m_pSet->m_istart;
dlg.m_ie=m_pSet->m_iend;
dlg.m_os=m_pSet->m_ostart;
dlg.m_oe=m_pSet->m_oend;

  余下的与添加记录代码相同,除了不要定位“m_pSet->MoveLast();”而已。

  删除记录只是需要使用Delete()成员函数删除当前记录之后移到下一个记录即可。程序清单如下:

void CJhView::OnDel()
{
 try//试着删除一条记录
 {
  m_pSet->Delete();
 }
 catch(CDBException*error)
 {
  AfxMessageBox(error->m_strError);
  error->Delete();
  m_pSet->MoveFirst();
  UpdateData(FALSE);
  return;
 }
 //移到下一个记录
 m_pSet->MoveNext();
 //测试是否为文件末尾,是,则使用MoveLast(),而不是使用MoveNext()
 if(m_pSet->IsEOF())
  m_pSet->MoveLast();
  UpdateData(FALSE);
}

  对多个记录集的操作与对单个记录集的操作类似,只是增加了CRecordSet类的派生类。

   结束语

  MFC ODBC让开发人员仅仅使用很少的代码就可以完成复杂的数据库访问,并可以对数据库中的内容方便的实现添加、修改、删除等操作,从而极大地减少了 软件开发的工作量,缩短了开发周期,提高了效率。而且MFC ODBC简单易学,能实现大部分ODBC API函数的功能,所以了解和掌握MFC ODBC技术,将会给大型数据库应用软件带来清晰、快捷、方便等功能。本文中的实例已经在Visual C++6.0环境下调试通过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值