1.MFC中的ODBC类
主要有CDatabase、CRecordset、CRecordview、CDBException、CFieldExchange。这些类封装了ODBC
SDK函数,可以很方便的操作支持ODBC的数据库。
(1)CDatabase类:封装应用程序与需要访问的数据库之间的连接,控制事务的提交和执行SQL语句的方法。
(2)CRecordset类:封装大部分操纵数据库的方法,包括浏览、修改记录、控制游标移动,排序等操作。CRecordset类是MFC的ODBC类中最重要、功能最强大的一个类。CRecordset类对象提供了从数据源中提取出的记录集。在多任务操作系统或网络环境中,多个用户可以共享同一个数据源。共享数据的一个主要问题是如何协调各个用户对数据源的修改。CRecordset提供了几种不同的方法来处理这个问题,这将由程序采用哪种类型的记录集来决定。
CRecordset对象通常用于两种形式:动态行集(dynasets)和快照集(snapshots)。动态行集能与其他用户所做的更改保持同步,快照集则是数据的一个静态视图,当别的用户改变了记录时(包括修改、添加和删除),快照中的记录不受影响,也就是说,快照不反映别的用户对数据源记录的改变.直到调用了CRecordset::Requery重新查询后,快照才会反映变化。每一种形式在记录集被打开时都提供一组记录,所不同的是,当在一个动态行集里滚动到一条记录时,由其他用户或是应用程序中其他记录集对该记录所做的更改会相应地显示出来,例如在火车联网销售系统中,应该实时的显示共享数据的变化。
(3)CRecordView类:提供与CRecordset对象相连接的视图,可以建立视图中的控件与数据库数据的对应,同时支持游标,修改记录等操作。
(4)CDBException类:提供对数据库操作的异常处理。
(5)CFieldExchange类:提供用户变量与数据库字段之间的数据交换。
2.域数据成员与数据交换
CRecordset类代表一个记录集。用户一般用ClassWizard创建一个CRecordset的派生类。ClassWizard可以为派生的记录集类创建一批数据成员,这些数据成员与记录的各字段相对应,被称为字段数据成员或域数据成员。域数据成员与表中的字段名字类似,且类型匹配。
例如:这是一个CRecordset类的派生类的定义
class CSetdata : public CRecordset
{
public:
CSetdata(CDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CSetdata)
// Field/Param Data
//{ {AFX_FIELD(CSetdata, CRecordset)
//定义域数据成员变量,域数据成员用来与记录集对应字段进行数据交换,起到一个缓冲区或中间桥梁的作用。也就是说,我们在处理记录集时,实际上是对域数据成员进行操作,而不是直接对数据库中的数据操作。 CString m_number;
CString m_name;
CString m_sex;
long m_age;
//}}AFX_FIELD
CString number;
// Overrides
// ClassWizard generated virtual function overrides
//{ {AFX_VIRTUAL(CSetdata)
public:
virtual CString GetDefaultConnect(); // Default connection string
virtual CString GetDefaultSQL(); // Default SQL for Recordset
virtual void DoFieldExchange(CF