Visual C++中用MFC ODBC操作Access数据库(1)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-1 06:57   458   0

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

1、ODBC数据源的创建

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

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

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

Visual C++中用MFC ODBC操作Access数据库

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,即为本项目所要操作的表。

Visual C++中用MFC ODBC操作Access数据库

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

 
  1. class CJhSet : public Crecordset//基于CRecordset的CjhSet新类
  2. {
  3. public:
  4. CJhSet(CDatabase* pDatabase = NULL);
  5. DECLARE_DYNAMIC(CJhSet)
  6. // Field/Param Data
  7. //{{AFX_FIELD(CJhSet, CRecordset)
  8. //对应表中一些被绑定字段的变量
  9. CString m_baudrate;
  10. CString m_type;
  11. CString m_unit;
  12. CString m_number;
  13. CString m_address;
  14. CString m_istart;
  15. CString m_iend;
  16. CString m_ostart;
  17. CString m_oend;
  18. //}}AFX_FIELD
  19. // Overrides
  20. // ClassWizard generated virtual function overrides
  21. //{{AFX_VIRTUAL(CJhSet)
  22. public:
  23. virtual CString GetDefaultConnect(); // 返回被连接的数据源名称
  24. virtual CString GetDefaultSQL(); // 返回数据源中所选表名称
  25. virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support
  26. //}}AFX_VIRTUAL
  27. // Implementation
  28. #ifdef _DEBUG
  29. virtual void AssertValid() const;
  30. virtual void Dump(CDumpContext& dc) const;
  31. #endif};

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

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

Visual C++中用MFC ODBC操作Access数据库

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

Visual C++中用MFC ODBC操作Access数据库

为了实现数据传输,就要把每个控件与代表数据库域的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)”键编写程序代码如下。其中已经作了详细的注解。

 
  1. void CJhView::OnAdd()
  2. {
  3. //建立一个新的添加对话框
  4. CAddDlg dlg;
  5. if(dlg.DoModal()==IDOK)
  6. {
  7. //增加一条新的记录
  8. m_pSet->AddNew();
  9. //把对话框中的记录传递到记录集中
  10. m_pSet->m_baudrate=dlg.m_br;
  11. m_pSet->m_type=dlg.m_ty;
  12. m_pSet->m_unit=dlg.m_un;
  13. m_pSet->m_number=dlg.m_nu;
  14. m_pSet->m_address=dlg.m_add;
  15. m_pSet->m_istart=dlg.m_is;
  16. m_pSet->m_iend=dlg.m_ie;
  17. m_pSet->m_ostart=dlg.m_os;
  18. m_pSet->m_oend=dlg.m_oe;
  19. m_pSet->Update(); //把新的记录存在数据源里
  20. m_pSet->MoveLast(); //指定当前记录为最后一条记录
  21. UpdateData(false); //清空已输入内容
  22. }
  23. }

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

 
  1. dlg.m_br=m_pSet->m_baudrate;
  2. dlg.m_ty=m_pSet->m_type;
  3. dlg.m_un=m_pSet->m_unit;
  4. dlg.m_nu=m_pSet->m_number;
  5. dlg.m_add=m_pSet->m_address;
  6. dlg.m_is=m_pSet->m_istart;
  7. dlg.m_ie=m_pSet->m_iend;
  8. dlg.m_os=m_pSet->m_ostart;
  9. dlg.m_oe=m_pSet->m_oend;

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

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

 
  1. void CJhView::OnDel()
  2. {
  3. try//试着删除一条记录
  4. {
  5. m_pSet->Delete();
  6. }
  7. catch(CDBException*error)
  8. {
  9. AfxMessageBox(error->m_strError);
  10. error->Delete();
  11. m_pSet->MoveFirst();
  12. UpdateData(FALSE);
  13. return;
  14. }
  15. //移到下一个记录
  16. m_pSet->MoveNext();
  17. //测试是否为文件末尾,是,则使用MoveLast(),而不是使用MoveNext()
  18. if(m_pSet->IsEOF())
  19. m_pSet->MoveLast();
  20. UpdateData(FALSE);
  21. }

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

总结:

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


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP