话不多说,先上图,如果你需要的是这样的程序,那么可以下载下来看一看,帖子里也会附上比较具体的操作步骤:
先附上下载地址:程序下载地址 程序已经经过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数据库