;栏选择刚注册的"RP97"数据源,点击"OK"后选择该数据库的一个表,点击"OK"在"ClassView"里就多了一个以CRecordSet为基类的新类"CODBCSet"。下面三个函数完成了数据库各级元素的绑定工作:
CString CODBCSet::GetDefaultConnect()
{
return _T("ODBC;DSN=RP97");
}
CString CODBCSet::GetDefaultSQL()
{
return _T("[单据表]");
}
void CODBCSet::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CODBCSet)
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, _T("[单据ID]"), m_column1);
RFX_Text(pFX, _T("[单据名称]"), m_column2);
RFX_Text(pFX, _T("[报帐人]"), m_column3);
//}}AFX_FIELD_MAP
}
(五)按同样的方法再添加一个基于"generic CWnd"的新类"CConnectDB"。在该类的源文件里添加对"ODBCSet.h"的引用:#include "ODBCSet.h"。在该类的头文件的"class CconnectDB"前添加class CODBCSet;并在该类里添加公有型成员变量和函数:
CDatabase m_dbData;
CODBCSet* m_pSet;
void CConnectDB::Initial()
{
//打开数据源RP97
CString os=_T("odbc; dsn=RP97");
m_dbData.Open(NULL,FALSE,FALSE,0);
m_pSet=new CODBCSet(&m_dbData);
//通过SQL结构化
查询语言打开RP97里的单据表
CString sql="SELECT * FROM 单据表";
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,sql);
}
(六)在Form上添加一个"测试"按钮及其响应函数OnTest():
void CNormalView::OnTest()
{
CConnectDB connectDB;
//执行完Initial()后m_pSet指针才不为空,方可安全使用。
connectDB.Initial();
if(connectDB.m_pSet==NULL)
return;
connectDB.m_pSet->MoveFirst();
CString str=connectDB.m_pSet->m_column3;
AfxMessageBox(str);
}
最后在该文件开始处添加两个引用:
#include "ConnectDB.h"
#include "ODBCSet.h"
四、 运行与测试
编译运行
程序,点击"测试"按钮,就会将"RP97"数据库的"单据表"的第一条记录的"报帐人"字段所在的内容通过对话框弹出来。
小结:
本程序的关键在于对数据库指针m_pSet的获取,当类CConnectDB 的成员函数Initial()被执行完时,m_pSet就已被获取到了,而在此之前该指针是空的,是不能使用的,所以在实际应用中必须保证在使用m_pSet之前调用过函数Initial()。当m_pSet被获取到之后,就可以想其他ODBC应用
程序一样使用CrecordSet类里的各种函数对数据库进行各种需要的操作和管理了。