MFC ODBC数据库编程

一、MFC提供的ODBC数据库类

  Visual C++MFC基类库定义了几个数据库类。在利用ODBC编程时,经常要使用到 CDatabase(数据库类)CRecordSet(记录集类)CRecordView(可视记录集类)

 

  CDatabase类:提供了对数据源的连接,通过它可以对数据源进行操作。

  CRecordSet类:提供了从数据源中提取出的记录集。

CRecordView类:以控件的形式显示数据库记录,这个视图是直接连到一个CRecordSet对象的表视图。

 

二、应用ODBC编程

  应用Visual C++的AppWizard可以自动生成一个ODBC应用程序框架,步骤是:打开File菜单的New选项,选取Projects,填入工程名,选择MFC AppWizard (exe),然后按AppWizard的提示进行操作。

  当AppWizard询问是否包含数据库支持时,如果想读写数据库,那么选定Database view with file support;如果想访问数据库的信息而不想写回所做的改变,那么选定Database view without file support

选好数据库支持之后,Database Source 按钮会被激活,选中它去调用Data Options对话框。在Database Options对话框中会显示出已向ODBC注册的数据库资源,选定所要操作的数据库,单击OK后出现Select Database Tables对话框,其中列举了选中的数据库包含的全部表;选择要操作的表后,单击OK。在选定了数据库和数据表之后,就可以按照惯例继续进行AppWizard操作。

 

重要机制:

RFX(Record Field Exchange):记录字段交换使记录集(CRecordset)和隐藏于后台的数据源(Datasource)之间建立起对应的关系。

CFieldExchange类:处理数据交换,该类支持数据库所使用的记录集字段交换(RFX)程序。RFX在记录集对象的字段数据成员与数据源中当前记录的相应字段之间交换数据。

 

例子:一个典型的DoFieldExchange函数

void CExpanseSet::DoFieldExchange(CFieldExchange* pFX)

{

     pFX->SetFieldType(CFieldExchange::outputColumn);

// RFX_Text() RFX_Int() 这类宏依赖的是

// 成员变量的类型,而不是数据库字段的类型。

// ODBC 尝试自动将列值转换为所请求的类型

     RFX_Single(pFX, _T("[id]"), m_id);

     RFX_Text(pFX, _T("[type]"), m_type);

     RFX_Single(pFX, _T("[cellnumber]"), m_cellnumber);

     RFX_Single(pFX, _T("[long]"), m_long);

     RFX_Text(pFX, _T("[site]"), m_site);

     RFX_Single(pFX, _T("[spend]"), m_spend);

}

DDXDialog Data Exchange):它在对话框上的控件与记录集的变量之间建立了一座桥梁,可以使它们双向交换数据。

CRecordView类:显示记录,该对象用于在控件中显示数据库记录的视图。这种视图是一种直接连接到一个CRecordset对象的格式视图,它从一个对话框模板资源创建,并将CRecordset对象的字段显示在对话框模板的控件里。

 

例子:一个典型的DoDataExchange函数

void CExpanseView::DoDataExchange(CDataExchange* pDX)

{

     CRecordView::DoDataExchange(pDX);

     // 可以在此处插入DDX_Field* 函数以将控件“连接”到数据库字段,例如

     // DDX_FieldText(pDX, IDC_MYEDITBOX, m_pSet->m_szColumn1, m_pSet);

     // DDX_FieldCheck(pDX, IDC_MYCHECKBOX, m_pSet->m_bColumn2, m_pSet);

     // 有关更多信息,请参阅MSDN ODBC 示例

     DDX_FieldText(pDX, IDC_ID, m_pSet->m_id, m_pSet); 

     DDX_FieldText(pDX, IDC_TYPE, m_pSet->m_type, m_pSet);

     DDX_FieldText(pDX, IDC_NUMBER, m_pSet->m_cellnumber, m_pSet);

     DDX_FieldText(pDX, IDC_TIME, m_pSet->m_long, m_pSet);

     DDX_FieldText(pDX, IDC_SITE, m_pSet->m_site, m_pSet);

     DDX_FieldText(pDX, IDC_SPEND, m_pSet->m_spend, m_pSet);

}

 

三、实例

1.查询记录

查询记录使用CRecordSet::Open()CRecordSet::Requery()成员函数。在使用CRecordSet类对象之前,必须使用CRecordSet::Open()函数来获得有效的记录集。一旦已经使用过CRecordSet::Open()函数,再次查询时就可以应用CRecordSet::Requery()函数。

在调用CRecordSet::Open()函数时,如果将一个已经打开的CDatabase对象指针传给CRecordSet类对象的m_pDatabase成员变量,则使用该数据库对象建立ODBC连接;否则如果m_pDatabase为空指针,就新建一个CDatabase类对象,并使其与缺省的数据源相连,然后进行CRecordSet类对象的初始化。缺省数据源由GetDefaultConnect()函数获得。也可以提供所需要的SQL语句,并以它来调用CRecordSet::Open()函数,例如:Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT,strSQL);

如果没有指定参数,程序则使用缺省的SQL语句,即对在GetDefaultSQL()函数中指定的SQL语句进行操作。

在查询过程中,也可以利用CRecordSet的成员变量m_strFilterm_strSort来执行条件查询和结果排序。m_strFilter为过滤字符串,存放着SQL语句中WHERE后的条件串;m_strSort为排序字符串,存放着SQL语句中ORDER BY后的字符串。如:

  Super_ESSet.m_strFilter=TYPE=‘电动机’″;

  Super_ESSet.m_strSort=VOLTAGE;

  Super_ESSet.Requery();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值