VS2013 MFC连接Access数据库(ADO)详细版实例操作(含Combo Box读取数据库内容,附源码)

话不多说,先上图,如果你需要的是这样的程序,那么可以下载下来看一看,帖子里也会附上比较具体的操作步骤:


先附上下载地址:程序下载地址 程序已经经过VS 2013+Windows 7+Access 2003的测试(运行出现其他问题应该多为环境问题,解决办法各位可以自行百度)

具体的操作步骤:

Step1:

首先新建一个基于对话框的MFC程序,我们封装一个专门用于数据库连接的类(不放在页面里是为了代码的清晰以及后期维护的方便):


注意:很多人愿意用connect来取名字,虽然这样我们封装类的时候不会有任何问题,但是后面进行数据库操作的时候就会报错,各位一定要避免使用此类关键字作为你得类名:


Step2:

我们需要导入ADO连接的系统文件,同时声明结果集:

首先是导入文件,我这里使用的是相对路径,推荐使用相对路径,这样不会出现后期因为系统(版本和位数)不一致造成的各种错误,代码:

#import "msado15.dll" no_namespace rename("EOF", "adoEOF")

相对路径需要将系统的这个文件复制到源文件的路径下(后面的数据库文件也一样,后面不再过多叙述):


如果各位想用绝对路径也可以,注意,如果使用绝对路径需要区分你的系统的位数,代码:

win32位系统:

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

win64位系统(Debug时也需要选择成X64):

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

完成后应该是这样的(注意!是在头文件导入)


Step3:

依旧是在头文件中的Public中声明结果集:

_ConnectionPtr m_pConnection;//连接access数据库的链接对象  
_RecordsetPtr m_pRecordset;//结果集对象  

完成后应该是这样的:


(导入后可能出现系统无法识别的问题,出现红色下划线,这时候我们可以等待一会或者保存项目重启VS2013即可消除错误提示)

Step4:

首先我们要新建一个Access数据库,这里要主要Access数据库的文件版本有两种(类似于Doc和Docx),在连接数据库时要注意!

1.2007版本以前的access文件扩展民是mdb(本程序使用!)
2 2007版本以后的access文件扩展名是accdb
注:MFC连接Access数据库后在别的机器上运行时不需要安装Access的,这样让数据库的使用可以更宽泛,同时这一连接模式可以兼容(Win XP—Win 10的所有系统版本)

进行数据库连接,这里我们需要在数据库连接类里添加初始化函数(如果是直接放到主界面中,直接将连接代码放入初始化函数中即可)这里演示封装连接类的做法,首先新建初始化函数:


然后在初始化函数中编辑连接代码:

	try{

		CoInitialize(NULL);
		m_pConnection = _ConnectionPtr(__uuidof(Connection));
		m_pConnection->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=mfc_access.mdb;";
		m_pConnection->Open("", "", "", adConnectUnspecified);
	}
	catch (_com_error e){

		AfxMessageBox(_T("数据库连接失败!"));
		return FALSE;
	}

这时我们可以进行一次Debug,如果程序正常运行,不报错,说明我们的数据库已经连接成功了

Step5:

数据库连接成功后,我们添加一个List Contrl控件来显示查询内容(具体使用读者可以百度,避免本文过于冗长,这里只介绍几个关键值的设置):



Step6:

进行数据库的相应操作(增、删、改、查),首先是查询操作:

try
		{
			_variant_t RecordsAffected;
			cmd.m_pRecordset.CreateInstance(__uuidof(Recordset));
			CString search_sql;
			search_sql = "SELECT * FROM cmdchoose";
			cmd.m_pRecordset = cmd.m_pConnection->Execute(search_sql.AllocSysString(), NULL, adCmdText);
			while (!cmd.m_pRecordset->adoEOF)
			{
				CString id;
				CString chooseid;
				CString choosevalue;
				id = cmd.m_pRecordset->GetCollect("id").bstrVal;
				m_list.InsertItem(0, id);
				chooseid = cmd.m_pRecordset->GetCollect("chooseid").bstrVal;
				m_list.SetItemText(0, 1, chooseid);
				choosevalue = cmd.m_pRecordset->GetCollect("choosevalue").bstrVal;
				m_list.SetItemText(0, 2, choosevalue);
				cmd.m_pRecordset->MoveNext();
			}
			cmd.m_pRecordset->Close();
		}
		catch (_com_error e)
		{
			AfxMessageBox(_T("搜索失败!"));
			return;
		}

增加数据库条目:

	_variant_t RecordsAffected;
	CString AddSql;
	CString cmdchooseID;
	CString cmdchoose;
	CString cmdchoosevalue;
	m_edit_chooseid.GetWindowText(cmdchooseID);
	m_editchoose.GetWindowText(cmdchoose);
	m_editchoosevalue.GetWindowText(cmdchoosevalue);
	AddSql.Format("INSERT INTO cmdchoose(id,chooseid,choosevalue) VALUES('" + cmdchooseID + "','" + cmdchoose + "','" + cmdchoosevalue + "')");
	try{
		cmd.m_pConnection->Execute((_bstr_t)AddSql, &RecordsAffected, adCmdText);
		AfxMessageBox(_T("添加命令成功!"));
		OnBnClickedSelect();
	}
	catch (_com_error*e){
		AfxMessageBox(_T("添加命令失败!"));
	}

删除数据库条目:

CString str;
	CString choose_del;
	m_choosedel.GetWindowText(choose_del);
	try
	{
		str.Format("DELETE from cmdchoose where id='" + choose_del + "'");
		_variant_t RecordsAffected;
		cmd.m_pConnection->Execute((_bstr_t)str, &RecordsAffected, adCmdText);
		AfxMessageBox(_T("删除成功!"));
		OnBnClickedSelect();
	}
	catch (_com_error*e)
	{
		AfxMessageBox(e->ErrorMessage());
	}

这里我在程序的下方新建了一个Combo控件用来演示数据库里的内容如何加入到Combo box中以及多个Combo的联动,这里主要困惑点在于如何点击Combo box实时进行数据库内容的读取,主要分为几步:

a、添加下拉响应函数,点击下拉时触发响应

b、进行数据库查询

c、将查询到的字符串进行处理,添加到Combo box中进行显示

这里触发响应的代码如下:

void CdatabaseDlg::OnDropdownComboCity()
{
	// TODO:  在此添加控件通知处理程序代码
	{
		maincmd.OnInitDialog();
		UpdateData(true);
		CString strName;
		m_choosename.ResetContent();
		try
		{
			maincmd.m_pRecordset.CreateInstance(__uuidof(Recordset));
			CString search_sql1;
			search_sql1.Format(_T("SELECT * FROM cmdchoose"));
			maincmd.m_pRecordset = maincmd.m_pConnection->Execute(search_sql1.AllocSysString(), NULL, adCmdText);
			while (!maincmd.m_pRecordset->adoEOF)
			{
				strName = maincmd.m_pRecordset->GetCollect("id").bstrVal;
				m_choosename.AddString(strName);
				maincmd.m_pRecordset->MoveNext();
			}
			maincmd.m_pRecordset->Close();
		}
		catch (_com_error e)
		{
			AfxMessageBox(_T("搜索失败!"));
			return;
		}
	}
}
部分内容参考的博文: VS2013在MFC中使用ADO方法操作Access2013数据库
  • 16
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值