第一步,要连接数据库,首先要有数据源。这里我们选择的数据源是Access mdb文件。数据库名为DataBase,然后新建employees表,表的字段设计如下图:
第二步,我们要使用MFC与Access连接,还要显示最终结果如下图:
这里我们首先要先设计窗体,窗体各个控件的属性如下所示:
列表控件 IDC_LIST1 查看方式为:列表
三个标签 分别命名为编号、姓名、学历
四个按钮控件
IDC_BUTADD
IDC_BUTMOD
IDC_BUTDEL
IDC_BUTCLEAR
分别为下图所示的这些控件关联变量,详情看下图:
由于对于我们这个要实现的对话框应用程序中,还可以通过鼠标拖动列表控件的一列、还有选中一行记录,相关的文本框也会显示对应的值这些功能,我们需要在基于对话框类的OnInitDialog()函数中添加如下代码:
m_Grid.SetExtendedStyle(LVS_EX_FLATSB
|LVS_EX_FULLROWSELECT
|LVS_EX_HEADERDRAGDROP
|LVS_EX_ONECLICKACTIVATE
|LVS_EX_GRIDLINES);
m_Grid.InsertColumn(0,"编号",LVCFMT_LEFT,110,0);
m_Grid.InsertColumn(1,"姓名",LVCFMT_LEFT,110,1);
m_Grid.InsertColumn(2,"学历",LVCFMT_LEFT,110,2);
AddToGrid();
第三步,要实现对数据库的操作,这里我们引用了windows系统自带的ADO动态链接库。
导入的方法是:打开文件视图,找到StdAfx.h 文件,在里面添加如下代码:
#import "C:Program FilesCommonFilesSystemadomsado15.dll" no_namespace
rename("EOF","adoEOF")rename("BOF","adoBOF")//导入ADO动态链接库
第四步,还要自定义一个数据库操作类。方法步骤如下:
1. 新建一个ADO类。
设置好类信息,系统会为我们自动生成ADO.h 跟ADO.cpp两个文件,ADO.h中用来放置类的结构设计,ADO.cpp用来放置该类的成员函数的具体定义。
这里我们将ADO.h中放置如下代码:
// ADO.h: interface for the ADO class.
//
//
#if !defined(AFX_ADO_H__E0F8432E_F797_4979_8FB0_EAC60CA6C7F9__INCLUDED_)
#define AFX_ADO_H__E0F8432E_F797_4979_8FB0_EAC60CA6C7F9__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif //_MSC_VER > 1000
class ADO
{
public:
_ConnectionPtr m_pConnection; //连接对象指针
_RecordsetPtr m_pRecordset; //记录集对象指针
public:
ADO();
virtual~ADO();
voidOnInitADOConn(); //连接数据库
_RecordsetPtr& OpenRecordset(CString sql); //打开记录集
voidCloseRecordset(); //关闭记录集
voidCloseConn(); //关闭数据库连接
UINTGetRecordCount(_RecordsetPtr pRecordset); //获得记录数
};
#endif // !defined(AFX_ADO_H__E0F8432E_F797_4979_8FB0_EAC60CA6C7F9__INCLUDED_)
在ADO.cpp里放置如下代码:
// ADO.cpp: implementation of the ADO class.
//
//
#include "stdafx.h"
#include "UseAdo.h"
#include "ADO.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//
// Construction/Destruction
//
ADO::ADO()
{
}
ADO::~ADO()
{
}
void ADO::OnInitADOConn()
{
::CoInitialize(NULL);
try
{
m_pConnection.CreateInstance("ADODB.Connection"); //创建连接对象实例
_bstr_t strConnect="DRIVER={MicrosoftAccess Driver (*.mdb)};
uid=;pwd=;DBQ=DataBase.mdb;";
m_pConnection->Open(strConnect,"","",adModeUnknown);//打开数据库
}
catch(_com_errore)
{
AfxMessageBox(e.Description());//弹出错误处理
}
}
_RecordsetPtr& ADO::OpenRecordset(CString sql)
{
ASSERT(!sql.IsEmpty()); //SQL语句不能为空
try
{
m_pRecordset.CreateInstance(__uuidof(Recordset));//创建记录集对象实例
m_pRecordset->Open(_bstr_t(sql),m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic, adCmdText); //执行SQL得到记录集
}
catch(_com_errore) //捕获可能的异常
{
AfxMessageBox(e.Description());
}
returnm_pRecordset;
}
void ADO::CloseRecordset()
{
if(m_pRecordset->GetState()== adStateOpen) //判断当前的记录集状态
m_pRecordset->Close(); //关闭记录集
}
void ADO::CloseConn()
{
m_pConnection->Close(); //关闭数据库连接
::CoUninitialize(); //释放COM环境
}
UINT ADO::GetRecordCount(_RecordsetPtrpRecordset)
{
intnCount = 0; //声明保存记录数的变量
try{
pRecordset->MoveFirst(); //将记录集指针移动到第一条记录
}
catch(...) //捕捉可能出现的错误
{
return0; //产生错误时返回0
}
if(pRecordset->adoEOF) //判断记录集中是否没有记录
return0; //无记录时返回0
while(!pRecordset->adoEOF) //当记录集指针没有指向最后时
{
pRecordset->MoveNext(); //将记录集指针移动到下一条记录
nCount= nCount + 1; //记录个数的变量加1
}
pRecordset->MoveFirst(); //将记录集指针移动到第一条记录
returnnCount; //返回记录数
}
这样,用来实现与Access数据库的ADO类就实现了。
第五步,因为我们在该对话框应用程序中要使用到基于对话框类的成员AddToGrid函数。该函数的设计如下:
void CUseAdoDlg::AddToGrid()
{
ADO m_Ado;
m_Ado.OnInitADOConn();//连接数据库
CStringSQL = "select * from employees order by 编号 desc"; //设置查询字符串
m_Ado.m_pRecordset= m_Ado.OpenRecordset(SQL);//打开记录集
while(!m_Ado.m_pRecordset->adoEOF)
{
m_Grid.InsertItem(0,"");
m_Grid.SetItemText(0,0,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("编号"));
m_Grid.SetItemText(0,1,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("姓名"));
m_Grid.SetItemText(0,2,(char*)(_bstr_t)m_Ado.m_pRecordset->GetCollect("学历"));
m_Ado.m_pRecordset->MoveNext();//将记录集指针移动到下一条记录
}
m_Ado.CloseRecordset();
m_Ado.CloseConn();//断开数据库连接
}
第六步,接下来就剩下对各个具体的控件的功能函数的实现了。具体有5个控件要添加单击事件(四个按钮与一个列表控件)。添加方法是:直接双击要添加处理事件的控件,会弹出如下对话框:
分别对之前提到的五个控件单击事件添加代码,具体代码如下:
Butadd按钮的单击事件代码:
void CUseAdoDlg::OnButadd()
{
//TODO: Add your control notification handler code here
UpdateData(TRUE);
if(m_ID.IsEmpty()|| m_Name.IsEmpty() || m_Culture.IsEmpty())
{
MessageBox("基础信息不能为空!");
return;
}
ADO m_Ado;
m_Ado.OnInitADOConn();
CStringsql = "select * from employees";
m_Ado.m_pRecordset= m_Ado.OpenRecordset(sql);
try
{
m_Ado.m_pRecordset->AddNew();//添加新行
m_Ado.m_pRecordset->PutCollect("编号",(_bstr_t)m_ID);
m_Ado.m_pRecordset->PutCollect("姓名",(_bstr_t)m_Name);
m_Ado.m_pRecordset->PutCollect("学历",(_bstr_t)m_Culture);
m_Ado.m_pRecordset->Update();//更新数据表记录
m_Ado.CloseRecordset();
m_Ado.CloseConn();
}
catch(...)
{
MessageBox("操作失败");
return;
}
MessageBox("添加成功");
m_Grid.DeleteAllItems();//删除列表控件
AddToGrid();
}
Butmod按钮的单击事件代码:
void CUseAdoDlg::OnButmod()
{
//TODO: Add your control notification handler code here
UpdateData(TRUE);
if(m_ID.IsEmpty()|| m_Name.IsEmpty() || m_Culture.IsEmpty())
{
MessageBox("基础信息不能为空!");
return;
}
intpos = m_Grid.GetSelectionMark();
ADO m_Ado;
m_Ado.OnInitADOConn();
CStringsql = "select * from employees";
m_Ado.m_pRecordset= m_Ado.OpenRecordset(sql);
try
{
m_Ado.m_pRecordset->Move((long)pos,vtMissing);
m_Ado.m_pRecordset->PutCollect("编号",(_bstr_t)m_ID);
m_Ado.m_pRecordset->PutCollect("姓名",(_bstr_t)m_Name);
m_Ado.m_pRecordset->PutCollect("学历",(_bstr_t)m_Culture);
m_Ado.m_pRecordset->Update();
m_Ado.CloseRecordset();
m_Ado.CloseConn();
}
catch(...)
{
MessageBox("操作失败");
return;
}
MessageBox("修改成功");
m_Grid.DeleteAllItems();
AddToGrid();
}
Butdel按钮的单击事件代码:
void CUseAdoDlg::OnButdel()
{
//TODO: Add your control notification handler code here
intpos = m_Grid.GetSelectionMark();
ADO m_Ado;
m_Ado.OnInitADOConn();
CStringsql = "select * from employees";
m_Ado.m_pRecordset= m_Ado.OpenRecordset(sql);
try
{
m_Ado.m_pRecordset->Move(pos,vtMissing);
m_Ado.m_pRecordset->Delete(adAffectCurrent);
m_Ado.m_pRecordset->Update();
m_Ado.CloseRecordset();
m_Ado.CloseConn();
}
catch(...)
{
MessageBox("操作失败");
return;
}
MessageBox("删除成功");
OnButclear();
m_Grid.DeleteAllItems();
AddToGrid();
}
Butclear按钮的单击事件代码:
void CUseAdoDlg::OnButclear()
{
//TODO: Add your control notification handler code here
m_ID = "";
m_Name = "";
m_Culture= "";
UpdateData(FALSE);
}
提示:Access数据库要放置在工程目录下,调试的时候才可以运行。如果单独要打开exe文件,必须要将数据库mdb文件放置在于exe文件夹一个目录下方可运行。
https://bbs.csdn.net/topics/30104508?utm_medium=distribute.pc_relevant_t0.none-task-discussion_topic-BlogCommendFromBaidu-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-discussion_topic-BlogCommendFromBaidu-1.channel_param