转自:http://hi.baidu.com/kmust_weiwei/blog/item/9dfbceda782881193af3cf0e.html
MFC提供对数据库编程的强大支持。对数据库访问,MFC提供两组类:ODBC(Open DataBase Connectivity)和DAO(DataBase Access Object)。
MFC的ODBC类对较复杂的ODBC API进行了封装,提供了简化的通用接口。
MFC的ODBC类主要包括以下几类:
1) CDatabase类:建立与数据库的链接。
2) CRecordset类:该类代表从数据源选择的一组记录(记录集),通过该类可对记录集中的记录进行滚动、修改、增加和删除等操作。
3) CRecordView类:提供了一个表单视图与某个记录集直接相连,利用对话框数据就交换机制(DDX)在记录集与表单视图的控件之间传输数据。该类支持对记录的浏览和更新。
4) CFileExchange类:支持记录字段数据交换(DFX)。
5) CDBException类:代表ODBC类产生的异常。
概括讲,CDatabase针对某个数据库,它负责连接数据源;CRecordset针对数据源中的记录集,它负责对记录的操作;CRecordView负责界面,而CFileExchange负责CRecordset与数据源的数据交换。
步骤:
创建一个基于MFC对话框的程序。添加四个按钮:连接、查询、添加、删除,并添加一个ListBox,对于变量m_List,用于显示数据。
1) 连接按钮响应函数
###############################
if(!IsOpenODBC())
MessageBox(_T("数据库开启失败。。。"),_T("数据库管理"),MB_OK);
else
MessageBox(_T("数据库管理ODBC开启成功!"),_T("数据库管理"),MB_OK);
###############################
2) 在*Dlg.h头文件中添加BOOL IsOpenODBC()成员函数,并在*Dlg.cpp中实现。
BOOL CtestDlg::IsOpenODBC()
{
int boll = 0;
CDatabase odbc;
TRY
{
odbc.Open(_T("test"),FALSE,FALSE,_T("ODBC;UID=sa"));
return TRUE;
}
CATCH_ALL(e)
{
return FALSE;
}
END_CATCH_ALL
}
3) 查询按钮响应函数
###############################
CDatabase myMdb;
myMdb.Open(_T("test"),FALSE,FALSE,_T("ODBC;UID=sa"));
CRecordset tmpRS(&myMdb);
tmpRS.Open(CRecordset::forwardOnly,_T("SELECT * FROM data"));
CString szResult;
while(!tmpRS.IsEOF())
{
tmpRS.GetFieldValue(_T("Name"),szResult);
m_List.AddString(szResult);
tmpRS.MoveNext();
}
tmpRS.Close();
myMdb.Close();
###############################
4) 添加按钮事件
因为这里建立的是基于对话框的应用程序,所以首先用添加类向导在项目里派生一个基类为CRecordset的Cdata类,在向导中要选择数据源和数据表,就选择先前创建好的数据源。
创建完成,会生成一个Cdata类,在data.h中添加一个函数声明:
Stactic void button11();
在data.cpp中实现这个函数:
###############################
CDatabase myMdb;
myMdb.Open(_T("test"),FALSE,FALSE,_T("ODBC;UID=sa"),TRUE);
MessageBox(AfxGetMainWnd()->m_hWnd,_T("数据库管理ODBC开启成功。"),_T("数据库管理"),MB_OK);
Cdata tmpRS(&myMdb);
if(!tmpRS.Open())
MessageBox(AfxGetMainWnd()->m_hWnd,_T("连接失败"),_T("错误信息"),MB_OK);
if(!tmpRS.CanAppend())
MessageBox(AfxGetMainWnd()->m_hWnd,_T("不能添加记录到数据库"),_T("错误信息"),MB_OK);
tmpRS.AddNew();
tmpRS.m_Name = _T("人名大会堂");
tmpRS.m_Number = _T("55555");
tmpRS.m_Scoreoo = 100;
tmpRS.Update();
tmpRS.Close();
myMdb.Close();
###############################
添加按钮事件添加响应函数:
Cdata::button11();
5) 删除事件
###############################
CDatabase m_dbCust;
CString sql = _T("delete * from data");
m_dbCust.Open(_T("test"),FALSE,FALSE,_T("ODBC;UID=sa"));
m_dbCust.ExecuteSQL(sql);
m_dbCust.Close();
###############################
错误处理:
1) CDatabase未声明过,添加:#include "afxdb.h"
2) 可能包含密码,如下处理,即把下面这句注释掉:
//#error Security Issue: The connection string may contain a password