VC6.0中用ado连接数据库出错
1. 在stdafx.h中添加 #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") rename("BOF", "adoBOF")
并且要在电脑注册32位的msado15.dll。我的win7下没有注册成功,我后来用的XP(XP系统已经注册了不用自己注册)
2. 在CxxxApp.cpp的InitInstance()函数中添加数据库连接代码,如下。
AfxEnableControlContainer(); ::CoInitialize(NULL);AfxOleInit(); HRESULT hr; try { //添加成员变量 _ConnectionPtr m_pCon; _RecordsetPtr m_pRs; hr = m_pCon.CreateInstance("ADODB.Connection");//创建连接。若电脑没注册成功,则连接就会出错,hr=-2147221164 if(SUCCEEDED(hr)) { m_pCon->CommandTimeout = 3; //连接延迟设置为3秒 hr = m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=restaurant.mdb","","",adModeUnknown);//连接数据库。此处可能出错,因为mdb文件不兼容(Access2013建的mdb要另存为2000..版本,再在XP上使用)。 } else { _com_error e(hr); AfxMessageBox(e.ErrorMessage());//hr=-2147221164 没有注册类 } } catch(_com_error e) { CString temp; temp.Format("连接数据库错误信息:%s,%s",e.ErrorMessage(),e.Description()); ::MessageBox(NULL,temp,"提示信息",NULL); return FALSE; }
-----------------------以下更新于2020/2/29
VS2013 VC++ ADO连接Access数据库(xxx.mdb)
新建MFC应用程序,名为AdoTest。
首先在 在stdafx.h中添加
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") rename("BOF", "adoBOF") #include "AdoTest.h" extern CAdoTestApp theApp;
在 AdoTest.h中添加成员变量
public: _ConnectionPtr m_pCon; _RecordsetPtr m_pRs;
在 AdoTest.cpp 中的 InitInstance()中添加,com库的初始化
CoInitialize(NULL);//表示com库的初始化,或者AfxOleInit();
类向导添加函数ExitInstance(),在其中加入代码
CoUninitialize();//释放com库。
然后,InitInstance()中连接数据库
// 在 AfxEnableControlContainer(); 语句后 ::CoInitialize(NULL); HRESULT hr; try { hr = m_pCon.CreateInstance("ADODB.Connection");//创建连接。若电脑没注册成功,则连接就会出错,hr=-2147221164 if (SUCCEEDED(hr)) { m_pCon->CommandTimeout = 3; //连接延迟设置为3秒 _bstr_t connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Library.mdb"; // Library.mdb文件与exe文件在同一目录,或当前工程目录 hr = m_pCon->Open(connStr, "", "", adModeUnknown);//连接数据库。此处可能出错,因为mdb文件不兼容(Access2013建的mdb要另存为2000..版本,再在XP上使用)。 } else { _com_error e(hr); AfxMessageBox(e.ErrorMessage());//hr=-2147221164 没有注册类 } } catch (_com_error e) { CString temp; temp.Format(L"连接数据库错误信息:%s,%s", e.ErrorMessage(), (TCHAR*)e.Description()); ::MessageBox(NULL, temp, L"提示信息", NULL); return FALSE; } m_pRs.CreateInstance("ADODB.Recordset");
简单的使用,部分参考MFC中使用ADO的记录集
theApp.m_pRs->Open("SELECT * FROM tb_User", _variant_t((IDispatch*)theApp.m_pCon, TRUE), adOpenKeyset, adLockPessimistic, adCmdText); // 注意:adLockUnspecified 的时候,使用 m_pRs->AddNew(); 会出错。故用 adLockPessimistic / adLockOptimistic //theApp.m_pRs->AddNew(); while (!theApp.m_pRs->adoEOF) { _variant_t var = theApp.m_pRs->GetCollect((_bstr_t)"name"); var = theApp.m_pRs->GetCollect((_bstr_t)"pwd"); theApp.m_pRs->MoveNext(); } theApp.m_pRs->Close(); ///////////////////////////////////////////// /////// 给数据库 User.mdb 添加一条纪录 ///// m_pRs->Open("SELECT * FROM tb_User", _variant_t((IDispatch*)m_pCon,TRUE),adOpenKeyset,adLockPessimistic,adCmdText); // 注意:adLockUnspecified 的时候,使用 m_pRs->AddNew(); 会出错。故用 adLockPessimistic / adLockOptimistic m_pRs->AddNew(); //设置字段的值 注意:设置空字符串会出错 m_pRs->PutCollect((_bstr_t)"ID", dlg.m_ID); m_pRs->PutCollect((_bstr_t)"Name", (_bstr_t)dlg.m_name); m_pRs->PutCollect((_bstr_t)"Sex", (long)dlg.m_sex); m_pRs->PutCollect((_bstr_t)"Salary", (_bstr_t)dlg.m_salary); m_pRs->Update();//更新保存 m_pRs->Close(); /////// 给数据库 User.mdb 修改一条纪录 ///// CString ID = m_list.GetItemText(nSel,0); CString sql = "SELECT * FROM tb_User WHERE ID = "+ID; m_pRs->Open((_bstr_t)sql, _variant_t((IDispatch*)m_pCon,TRUE),adOpenKeyset,adLockPessimistic,adCmdText); if(m_pRs->GetRecordCount() != 1) return; CEditDlg dlg; /* dlg.m_ID = atoi(ID); dlg.m_name = m_list.GetItemText(nSel, 1); dlg.m_sex = m_list.GetItemText(nSel, 2) == "男" ? 0:1; dlg.m_salary = m_list.GetItemText(nSel, 3);*/ // 法2:获取纪录的字段的值 注意:设置空字符串会出错 dlg.m_ID = m_pRs->GetFields()->Item["ID"]->Value; dlg.m_name = (char*)(_bstr_t)m_pRs->GetFields()->Item["Name"]->Value; dlg.m_sex = (long)m_pRs->GetFields()->Item["Sex"]->Value; dlg.m_salary = (char*)(_bstr_t)m_pRs->GetFields()->Item["Salary"]->Value; if(IDOK == dlg.DoModal()) { m_pRs->PutCollect((_bstr_t)"ID", dlg.m_ID); m_pRs->PutCollect((_bstr_t)"Name", (_bstr_t)dlg.m_name); m_pRs->PutCollect((_bstr_t)"Sex", (long)dlg.m_sex); m_pRs->PutCollect((_bstr_t)"Salary", (_bstr_t)dlg.m_salary); m_pRs->Update(); UpdateList(); } m_pRs->Close(); //////////////// 删除一条记录 ///////////////// int nSel = m_list.GetSelectionMark(); if(m_list.GetSelectedCount() < 1) { MessageBox("请选择一行纪录再修改!","提示"); return; } if(m_pRs->GetState() == adStateOpen)//系统定义 adStateOpen = 1 { m_pRs->Close(); } CString ID = m_list.GetItemText(nSel,0); /* CString sql = "SELECT * FROM tb_User WHERE ID = "+ID; m_pRs->Open((_bstr_t)sql, _variant_t((IDispatch*)m_pCon,TRUE),adOpenKeyset,adLockPessimistic,adCmdText); m_pRs->Delete(adAffectCurrent);//删除当前行 m_pRs->Update(); m_pRs->Close();*/ //以下两句可代替上面的代码块,同样可以实现删除 CString sql = "DELETE FROM tb_User WHERE ID = " + ID; m_pCon->Execute((_bstr_t)sql, NULL, adCmdText); UpdateList(); //////////////////////////
***************