找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 33|回复: 0

C++ 读取MDB数据库

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-9-26 10:25:42 | 显示全部楼层 |阅读模式
  1. /// <summary>
  2. /// 读取MDB
  3. /// </summary>
  4. /// <param name="mdbMpPath">MDB路径</param>
  5. /// <param name="strSql">sql语句</param>
  6. /// <param name="zddz"></param>
  7. void CMyPalette1ChildDlg::ReadMDB(const CString& mdbMpPath, const CString& strSql, std::map<CString, CString>& zddz)
  8. {
  9.         if (!AfxOleInit())//这就是初始化COM库
  10.         {
  11.                 AfxMessageBox(L"OLE初始化出错!");
  12.                 return;
  13.         }
  14.         _ConnectionPtr m_pConnection;
  15.         _RecordsetPtr m_pRecordset;
  16.         //_CommandPtr m_pCommand;
  17.         CString strSQL; //配置初始连接串
  18.         strSQL = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=";
  19.         strSQL += mdbMpPath;
  20.         strSQL += ";";
  21.         HRESULT hr;
  22.         try
  23.         {
  24.                 hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
  25.                 if (SUCCEEDED(hr))
  26.                 {
  27.                         hr = m_pConnection->Open((_bstr_t)strSQL, "", "", adModeUnknown);///连接数据库
  28.                         ///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; }
  29.                         m_pRecordset.CreateInstance("ADODB.Recordset");
  30.                         try
  31.                         {
  32.                                 //打开数据库
  33.                                 m_pRecordset->Open((_bstr_t)strSql,
  34.                                         m_pConnection.GetInterfacePtr(),//或使用_variant_t((IDispatch*)theApp.m_pConnection,true),,但需要extern声明theApp;
  35.                                         adOpenDynamic,
  36.                                         adLockOptimistic,
  37.                                         adCmdText);
  38.                                 //遍历读取
  39.                                 while (!m_pRecordset->adoEOF)//adoEOF判断数据库指针是否已经到结果集末尾;BOF判断是否在第一条记录前面
  40.                                 {
  41.                                         auto key = m_pRecordset->GetCollect("类型");
  42.                                         //这里已经读到当前记录的ID,需要进行非空等判断,非空之后就可以处理,比如添加到列表框等。
  43.                                         auto value = m_pRecordset->GetCollect("值");
  44.                                         zddz[key] = value;
  45.                                         //....
  46.                                         m_pRecordset->MoveNext();
  47.                                 }
  48.                                 m_pRecordset->Close();//关闭记录集
  49.                                 //m_pRecordset->Release();
  50.                         }
  51.                         catch (_com_error error)
  52.                         {
  53.                                 if (m_pRecordset->State) {
  54.                                         m_pRecordset->Close();//关闭记录集
  55.                                         //m_pRecordset->Release();
  56.                                 }
  57.                                 CString errorMessage;
  58.                                 errorMessage.Format(L"%s", (LPTSTR)error.Description());
  59.                                 AfxMessageBox(errorMessage);
  60.                                 return;
  61.                         }
  62.                         if (m_pConnection->State)//如果连接有效
  63.                         {
  64.                                 m_pConnection->Close();
  65.                                 //m_pConnection->Release();
  66.                         }
  67.                 }
  68.         }
  69.         catch (_com_error e)///捕捉异常
  70.         {
  71.                 if (m_pRecordset->State) {
  72.                         m_pRecordset->Close();//关闭记录集
  73.                         //m_pRecordset->Release();
  74.                 }
  75.                 if (m_pConnection->State)//如果连接有效
  76.                 {
  77.                         m_pConnection->Close();
  78.                         //m_pConnection->Release();
  79.                 }
  80.                 CString errormessage;
  81.                 errormessage.Format(L"连接数据库失败!\r\n错误:%s!", e.ErrorMessage());
  82.                 AfxMessageBox(errormessage);///显示错误信息
  83.         }
  84. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-27 22:04 , Processed in 0.116735 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表