microsoft activex data objects (ado) 支持用于建立基于客户端/服务器和 web 的应用程序的主要功能。其主要优点是易于使用、高速度、低内存支出和占用磁盘空间较少。本次封装的cadointerface类仅针对mfc的使用,目的是优化对ado的操作,避免频繁写try catch
microsoft activex data objects (ado) 支持用于建立基于客户端/服务器和 web 的应用程序的主要功能。其主要优点是易于使用、高速度、低内存支出和占用磁盘空间较少。 本次封装的cadointerface类仅针对mfc的使用,目的是优化对ado的操作,避免频繁写try catch(…)以及在连库、开表、写数据、读数据等过程中一些重复性的工作。该类仅对一些常用的操作进行封装,用户可以根据需要进行修改和扩展。
封装类主要包括:基本操作、增值操作、支持算法与支持结构。基本操作、增值操作、支持算法在cdatabase.h与cdatabase.cpp中声明定义。
1.用#import指令引入ado类型库为了引入ado类型库,需要在项目的stdafx.h文件中加入如下语句: #import c:\program files\common files\system\ado\msado15.dll no_namespace rename(eof, adoeof)注意添加的位置在#endif //_afx_no_afxcmn_support之后
2.将封装类加到工程中 cdatabase.h代码如下:
class cdatasource {public: //当前记录指针是否到了所有记录之后 bool iseof(); //当前记录指针是否到了所有记录之前 bool isbof(); //删除当前记录 void delete(); //设置fieldname字段的值为value(int型) void setasinteger(cstring fieldname, int value); //设置fieldname字段的值为value(cstring型) void setasstring(cstring fieldname, cstring value); //将记录的修改更新到数据库中 void update(); //新增一条记录 void new(); //得到fieldname字段的值(int型) int getasinteger(cstring fieldname); //得到fieldname字段的值(cstring型) cstring getasstring(cstring fieldname); //当前记录指针是否到了最后一条记录 bool islast(); //当前记录指针是否到了第一条记录 bool isfirst(); //移动当前记录指针到下一条记录 void movenext(); //移动当前记录指针到上一条记录 void moveprev(); //移动当前记录指针到最后一条记录 void movelast(); //移动当前记录指针到第一条记录 void movefirst(); //初始化数据 void initdata(); cdatasource(); virtual ~cdatasource();private: int m_maxid; _recordsetptr m_precordset; _connectionptr m_pconn; //释放数据 void freedata();};
3.cdatabase.cpp如下:#include datasource.hcdatasource::cdatasource(){}cdatasource::~cdatasource(){ freedata();}void cdatasource::initdata(){ //初始化com对象,为使用ado做准备 coinitialize(null); //初始化连接对象 m_pconn.createinstance(adodb.connection); //初始化记录集对象 m_precordset.createinstance(adodb.recordset); try { //打开数据库连接 m_pconn->open(provider=microsoft.jet.oledb.4.0;data source=..\\data\\demo.mdb;persist security info=false, , , adconnectunspecified); //初始化m_maxid m_precordset->open(select max(id) as maxid from profile, _variant_t(m_pconn, true), adopenstatic, adlockoptimistic, adcmdtext); m_maxid = getasinteger(maxid); m_precordset->close(); //打开指定记录集 m_precordset->open(select * from profile, _variant_t(m_pconn, true), adopenstatic, adlockoptimistic, adcmdtext); } catch(_com_error &e) { ::afxmessagebox(e.errormessage()); }}void cdatasource::freedata(){ if (m_pconn) { m_pconn->close(); m_precordset.release(); m_pconn.release(); couninitialize(); }}void cdatasource::movefirst(){ m_precordset->movefirst();}void cdatasource::movelast(){ m_precordset->movelast();}void cdatasource::moveprev(){ m_precordset->moveprevious();}void cdatasource::movenext(){ m_precordset->movenext();}bool cdatasource::isfirst(){ if (m_precordset->bof) { return true; } else { m_precordset->moveprevious(); bool result = m_precordset->bof; m_precordset->movenext(); return result; }}bool cdatasource::islast(){ if (m_precordset->endoffile) { return true; } else { m_precordset->movenext(); bool result = m_precordset->endoffile; m_precordset->moveprevious(); return result; }}cstring cdatasource::getasstring(cstring fieldname){ //如果在第一条记录之前或者最后一条记录之后,返回空 if (isbof() || iseof()) return ; lptstr lpfieldname = fieldname.getbuffer(fieldname.getlength()); //得到当前记录指定列的值 _variant_t vvalue = m_precordset->fields->item[lpfieldname]->value; //如果为空值则返回空 if ((v_vt(&vvalue) == vt_null) || (v_vt(&vvalue) == vt_empty)) { return ; } //否则以字符串形式返回vvalue的值 else { cstring strresult; lptstr lpresult = strresult.getbuffer(strlen(_bstr_t(vvalue))); strcpy(lpresult, _bstr_t(vvalue)); strresult.releasebuffer(); return strresult; }}int cdatasource::getasinteger(cstring fieldname){ //如果在第一条记录之前或者最后一条记录之后,返回0 if (isbof() || iseof()) return 0; lptstr lpfieldname = fieldname.getbuffer(fieldname.getlength()); //得到当前记录指定列的值 _variant_t vvalue = m_precordset->fields->item[lpfieldname]->value; //如果为空值则返回空 if (v_vt(&vvalue) == vt_null) { return 0; } //否则以int形式返回vvalue的值 else { return atoi(_bstr_t(vvalue)); }}void cdatasource::new(){ //添加一条新的记录 m_precordset->addnew(); //设置初始值 m_maxid++; setasinteger(id, m_maxid); setasstring(name, 无名氏); setasinteger(gender, 0); setasinteger(age, 24); setasstring(nationality, 汉); setasstring(address, ); setasstring(postcode, ); setasstring(note, ); //更新 m_precordset->update();}void cdatasource::update(){ m_precordset->update();}void cdatasource::setasstring(cstring fieldname, cstring value){ //将列名(fieldname)由cstring转为lptstr型 lptstr lpfieldname = fieldname.getbuffer(fieldname.getlength()); //将value由cstring转为lptstr型 lptstr lpvalue = value.getbuffer(value.getlength()); //将value值更新到recordset中 m_precordset->fields->item[lpfieldname]->value = lpvalue; //释放缓冲区 fieldname.releasebuffer(); value.releasebuffer(); }void cdatasource::setasinteger(cstring fieldname, int value){ cstring cs; //将value由int型转为cstring型 cs.format(%d, value); //使用setasstring设置指定列的值 setasstring(fieldname, cs);}void cdatasource::delete(){ //删除当前记录 m_precordset->delete(adaffectcurrent); }bool cdatasource::isbof(){ return m_precordset->bof;}bool cdatasource::iseof(){ return m_precordset->endoffile;}
代码链接:点击打开链接
添加操作:new()->m_ds.setasstring(name);->m_ds.update();
删除操作:m_ds.delete()->m_ds.update();(删除m_ds指向的记录集)