打印

MFC之ACCESS数据库操作

[复制链接]
1202|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 红蛋大叔 于 2018-7-19 11:31 编辑

接着之前的MFC编程,在应用时,我们有时需要读写很多数据,这时可能我们可能需要使用MFC对
ACCESS数据库进行编程,具体步骤以及代码如下。

1:在stdafx.h文件中添加如下入口



#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

2:初始化COM环境---AfxOleInit()


3:ado封装
class app_ado
{
private:
  char *sql_connect_path;   //数据库连接路径
  char *sql_name;           //数据库中数据集名称

public:
  _ConnectionPtr m_pConnection;  //连接数据库使用
  _RecordsetPtr  m_pRecordset;   //操作数据集使用

public:
app_ado(char *p, char *n)
{
   sql_connect_path = p;
   sql_name = n;
}

void app_ado_connect(void );      //连接数据库
void app_ado_disconnect(void );   //断开连接

void app_ado_open(void );         //打开数据集
void app_ado_close(void );
};

void app_ado::app_ado_connect(void )
{
  m_pConnection.CreateInstance(__uuidof(Connection));
  
  try
  {
    m_pConnection->Open((_bstr_t)sql_connect_path,"","",adModeUnknown);
  }
  catch(_com_error e)
  {
    AfxMessageBox("数据库连接失败");
  }
}

void app_ado::app_ado_disconnect(void )
{
  if(m_pConnection->State)
  {
    m_pConnection->Close();
  }
}

void app_ado::app_ado_open(void )
{
  CString str = "SELECT * FROM ";
  char p[50];
  char *q;

  str += sql_name;
  app_ado_connect();
  m_pRecordset.CreateInstance(__uuidof(Recordset));
  try
  {
    m_pRecordset->Open(str.GetBuffer(0),
                m_pConnection.GetInterfacePtr(),
                adOpenDynamic,
                adLockOptimistic,
                adCmdText);
  }
  catch(_com_error e)
  {
    AfxMessageBox("数据集打开失败");
  }
}
void app_ado::app_ado_close(void )
{
  m_pRecordset->Close();
  app_ado_disconnect();
}

4:获取mdb文件的路径
//////////////////////////////////////////////////////////////////////////////////
//全局标量
char filepath[256];
CString mdbpath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
char *connect_str;
char *table_name;
////////////////////////////////////////////////////////////////////////////////////
//定义以及初始化都在对话框中
char *p;
  //获取应用程序(.exe)路径(在debug文件下)
GetModuleFileName(AfxGetInstanceHandle(),filepath,256);
p = strrchr(filepath, '\\'); //查找\最后出现的位置
*p = 0;                        
mdbpath += filepath;   
mdbpath += "\\RfIdWrite.mdb";
table_name = "data";     //我的数据表名称是"data"
connect_str= mdbpath .GetBuffer(0);  


5:操作实例
5.1)遍历数据表
_variant_t var;
CString strName;


app_ado ado(connect_str, table_name);  //实例化对象,connect_str指的的是数据库路径,table_name数据库中的数据表名称

ado.app_ado_open();
ado.m_pRecordset->MoveFirst(); //移动到表头
while(!ado.m_pRecordset->adoEOF)
{
     var = ado.m_pRecordset->GetCollect("name");
     if(var.vt != VT_NULL)
    {
       strName = (LPCSTR)_bstr_t(var);
    }
     ado.m_pRecordset->MoveNext();
}
ado.app_ado_close();


5.2)写入数据表

app_ado ado(connect_str, table_name);

ado.app_ado_open();
ado.m_pRecordset->MoveFirst();
ado.m_pRecordset->Move(1);                      //移动到第一条记录   
//ado.m_pRecordset->AddNew();                  //从最后位置增加一条记录
ado.m_pRecordset->PutCollect("dt", "123456");
ado.m_pRecordset->PutCollect("name", "okadaf");
ado.m_pRecordset->Update();                      //更新数据集
ado.app_ado_close();


5.3)删除数据表中的数据
app_ado ado(connect_str, table_name);

ado.app_ado_open();
ado.m_pRecordset->MoveFirst();
ado.m_pRecordset->Move(1);                      //移动到第一条记录
ado.m_pRecordset->Delete(adAffectCurrent);  //删除当前记录
ado.app_ado_close();


源代码:
https://pan.baidu.com/s/1S4M9l_DTbHgCh2tSZaBB3w


效果图:






相关帖子

沙发
红蛋大叔|  楼主 | 2018-7-19 09:53 | 只看该作者

使用特权

评论回复
板凳
liubinghui| | 2018-10-20 08:38 | 只看该作者
         学习了谢谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

69

帖子

3

粉丝