分享

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

 行走在理想边缘 2018-12-26

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


先附上下载地址:程序下载地址 程序已经经过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中声明结果集:

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

完成后应该是这样的:


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

Step4:

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

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

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


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

  1. try{

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

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

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

Step5:

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



Step6:

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

  1. try
  2. {
  3. _variant_t RecordsAffected;
  4. cmd.m_pRecordset.CreateInstance(__uuidof(Recordset));
  5. CString search_sql;
  6. search_sql = "SELECT * FROM cmdchoose";
  7. cmd.m_pRecordset = cmd.m_pConnection->Execute(search_sql.AllocSysString(), NULL, adCmdText);
  8. while (!cmd.m_pRecordset->adoEOF)
  9. {
  10. CString id;
  11. CString chooseid;
  12. CString choosevalue;
  13. id = cmd.m_pRecordset->GetCollect("id").bstrVal;
  14. m_list.InsertItem(0, id);
  15. chooseid = cmd.m_pRecordset->GetCollect("chooseid").bstrVal;
  16. m_list.SetItemText(0, 1, chooseid);
  17. choosevalue = cmd.m_pRecordset->GetCollect("choosevalue").bstrVal;
  18. m_list.SetItemText(0, 2, choosevalue);
  19. cmd.m_pRecordset->MoveNext();
  20. }
  21. cmd.m_pRecordset->Close();
  22. }
  23. catch (_com_error e)
  24. {
  25. AfxMessageBox(_T("搜索失败!"));
  26. return;
  27. }

增加数据库条目:

  1. _variant_t RecordsAffected;
  2. CString AddSql;
  3. CString cmdchooseID;
  4. CString cmdchoose;
  5. CString cmdchoosevalue;
  6. m_edit_chooseid.GetWindowText(cmdchooseID);
  7. m_editchoose.GetWindowText(cmdchoose);
  8. m_editchoosevalue.GetWindowText(cmdchoosevalue);
  9. AddSql.Format("INSERT INTO cmdchoose(id,chooseid,choosevalue) VALUES('" + cmdchooseID + "','" + cmdchoose + "','" + cmdchoosevalue + "')");
  10. try{
  11. cmd.m_pConnection->Execute((_bstr_t)AddSql, &RecordsAffected, adCmdText);
  12. AfxMessageBox(_T("添加命令成功!"));
  13. OnBnClickedSelect();
  14. }
  15. catch (_com_error*e){
  16. AfxMessageBox(_T("添加命令失败!"));
  17. }

删除数据库条目:

  1. CString str;
  2. CString choose_del;
  3. m_choosedel.GetWindowText(choose_del);
  4. try
  5. {
  6. str.Format("DELETE from cmdchoose where id='" + choose_del + "'");
  7. _variant_t RecordsAffected;
  8. cmd.m_pConnection->Execute((_bstr_t)str, &RecordsAffected, adCmdText);
  9. AfxMessageBox(_T("删除成功!"));
  10. OnBnClickedSelect();
  11. }
  12. catch (_com_error*e)
  13. {
  14. AfxMessageBox(e->ErrorMessage());
  15. }

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

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

b、进行数据库查询

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

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

  1. void CdatabaseDlg::OnDropdownComboCity()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. {
  5. maincmd.OnInitDialog();
  6. UpdateData(true);
  7. CString strName;
  8. m_choosename.ResetContent();
  9. try
  10. {
  11. maincmd.m_pRecordset.CreateInstance(__uuidof(Recordset));
  12. CString search_sql1;
  13. search_sql1.Format(_T("SELECT * FROM cmdchoose"));
  14. maincmd.m_pRecordset = maincmd.m_pConnection->Execute(search_sql1.AllocSysString(), NULL, adCmdText);
  15. while (!maincmd.m_pRecordset->adoEOF)
  16. {
  17. strName = maincmd.m_pRecordset->GetCollect("id").bstrVal;
  18. m_choosename.AddString(strName);
  19. maincmd.m_pRecordset->MoveNext();
  20. }
  21. maincmd.m_pRecordset->Close();
  22. }
  23. catch (_com_error e)
  24. {
  25. AfxMessageBox(_T("搜索失败!"));
  26. return;
  27. }
  28. }
  29. }
部分内容参考的博文:VS2013在MFC中使用ADO方法操作Access2013数据库

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多