赞
踩
话不多说,先上图,如果你需要的是这样的程序,那么可以下载下来看一看,帖子里也会附上比较具体的操作步骤:
先附上下载地址:程序下载地址 程序已经经过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数据库
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。