计算机小白,初学VS2015利用ado方式连接Access数据库,成功案例。

初学者 同时被 3 个专栏收录
0 篇文章 0 订阅
1 篇文章 0 订阅
1 篇文章 0 订阅

MFC VS2015利用ado方式连接Access数据库(附源码,亲测可用)
本人系准研究生,暑期留校学习,计算机小白,初学C++,为完成老师布置的任务,其中涉及到数据库的连接,按照老师的要求避免对数据源进行配置,特采用ado方式连接Access数据库。经多次查阅资料加上自己的理解,最终得以对其进行实现。特将过程写下来与大家一起学习和以备后期复习之用。
首先,此程序的运行界面如图:
在这里插入图片描述
对数据库的各项内容进行显示,并可对其进行增删改查操作。
具体的过程简写为:
1…首先建立一个基于对话框的MFC程序,主界面可按照上图进行设计,并对其各个控件添加变量。另外建立一个Access数据库,本程序所用的数据库为.mdb格式。
2…在stdafx.h文件末尾添加如下代码:

#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename ("EOF", "adoEOF")

注意:此句代码尽量放在同一行中,如确需要分行,要加分隔符。
3…在app.h文件中添加如下代码进行函数和变量的声明:

_ConnectionPtr  m_pConnection;
virtual int ExitInstance();

4…在app.cpp中加上如下代码:

AfxOleInit();
	m_pConnection.CreateInstance(__uuidof(Connection));

并进行打开本地数据库的操作,本程序的数据库名称为Database1.mdb。

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= Database1.mdb", "", "", adModeUnknown);

此处最好利用try catch 语句形式来定位是否成功连接(详细定义见源代码,此处不再赘述)。
注:务必事先将已经编辑好的数据库放到本程序的文件夹位置,如图所示:
在这里插入图片描述
5…在Dlg.h文件中添加代码,声明三大指针,以及错误显示函数:

static void dump_com_error(_com_error &e);  
	_ConnectionPtr m_pConnection;
	_CommandPtr m_pCommand;
	_RecordsetPtr m_pRecordset;

dump_com_error函数的定义会在源文件上进行声明(篇幅有限,声明过程不再赘述,用Afxmessagebox同样可以实现此功能)。
6…在Dlg.cpp文件中的初始化中对表格进行初始化,并将数据库中的表进行连接和开启。实现代码如下:

m_pRecordset.CreateInstance(__uuidof(Recordset));
	long sum;
	try
{
	m_pRecordset->Open("SELECT * FROM t_work",
		theApp.m_pConnection.GetInterfacePtr(),	 // 获取库接库的IDispatch指针
												 //_variant_t((IDispatch*)m_pConnection,
		adOpenDynamic,
		adLockOptimistic,
		adCmdText);
	sum = m_pRecordset->GetCacheSize();
}
catch (_com_error& e)
	{
		dump_com_error(e);
	}

在进行增删改查之前,还需要加入以下函数功能进行辅助,以获取选中的表中某行数据和位置:

void CAccess_ConnectionDlg::OnLvnItemchangedListaccess(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	for (int k = 0; k < m_AccessList.GetItemCount(); k++)
	{
		if (m_AccessList.GetItemState(k,LVIS_SELECTED) == LVIS_SELECTED)
		{
		n = k;
		m_ID = m_AccessList.GetItemText(k, 0);
		m_Name = m_AccessList.GetItemText(k, 1);
		m_Function = m_AccessList.GetItemText(k, 2);
		m_Value = m_AccessList.GetItemText(k, 3);
		m_Range = m_AccessList.GetItemText(k, 4);
		m_Alarm = m_AccessList.GetItemText(k, 5);
		UpdateData(FALSE);
	}
}
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;

}
此功能可以实时显示选中的数据,并可将行数传输给全局变量n,提供给删除和修改过程使用。
7…写入新的数据操作:

try
	{
		// 写入各字段值
		m_pRecordset->AddNew();
		m_pRecordset->PutCollect("ID", _variant_t(m_ID));
		m_pRecordset->PutCollect("Name", _variant_t(m_Name));
		m_pRecordset->PutCollect("Function", _variant_t(m_Function));
		m_pRecordset->PutCollect("Value", _variant_t(m_Value));
		m_pRecordset->PutCollect("Range", _variant_t(m_Range));
		m_pRecordset->PutCollect("Alarm", _variant_t(m_Alarm));
		m_pRecordset->Update();
		AfxMessageBox(_T("插入成功!"));
		// 重新读取以更新显示其库内容
		OnBnClickedReadaccess();
	}
catch (_com_error& e)
	{
		dump_com_error(e);
	}

8…查询操作:

_variant_t var;
while (!m_pRecordset->BOF)
		{
			var = m_pRecordset->GetCollect("ID");
			if (var.vt != VT_NULL)
				strID = (LPCSTR)_bstr_t(var);
			var = m_pRecordset->GetCollect("Name");
			if (var.vt != VT_NULL)
				strName = (LPCSTR)_bstr_t(var);
			var = m_pRecordset->GetCollect("Function");
		...
			m_AccessList.InsertItem(0, strID);
			m_AccessList.SetItemText(0, 1, strName);
			m_AccessList.SetItemText(0, 2, strFunction);
			...
		}

9…删除过程

try
	{
		m_pRecordset->Move(n+1);
		m_pRecordset->Delete(adAffectCurrent);
		m_pRecordset->Update();
		//m_pRecordset->Requery(NULL);
		OnBnClickedReadaccess();
		AfxMessageBox(_T("删除成功"));
	}

10…修改过程

try
	{
		// 写入各字段值
		m_pRecordset->Move(n+1);
		m_pRecordset->PutCollect("ID", _variant_t(m_ID));
		m_pRecordset->PutCollect("Name", _variant_t(m_Name));
		m_pRecordset->PutCollect("Function", _variant_t(m_Function));
		m_pRecordset->PutCollect("Value", _variant_t(m_Value));
		m_pRecordset->PutCollect("Range", _variant_t(m_Range));
		m_pRecordset->PutCollect("Alarm", _variant_t(m_Alarm));
		m_pRecordset->Update();
		AfxMessageBox(_T("修改成功!"));
		// 更新显示其库内容
		OnBnClickedReadaccess();
	}

11…其中删除和修改过程move(n+1)的作用是将记录集指针挪到鼠标所选中位置,接下来再对其进行相应操作,就很简单了。另外,在每个实现代码之后要补充错误显示函数,也就是:

 catch (_com_error& e)
	{
		dump_com_error(e);
	}

12…由于这是本人第一次写东西,也是一小白,只能将自己所理解的写上去,某些代码的具体作用原理还有待进一步探究。而且因为篇幅有限,不能完整的将整个过程写下来,只能给大家提供一些仅有的借鉴,具体的完整程序大家有兴趣的话可以看下源码,希望和一些跟我一样的初学者们一起学习进步。源码地址为:https://download.csdn.net/download/butilikeyou/11301675

  • 2
    点赞
  • 0
    评论
  • 13
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Butilikeyou

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值