admin 发表于 2024-9-26 10:25:42

C++ 读取MDB数据库

/// <summary>
/// 读取MDB
/// </summary>
/// <param name="mdbMpPath">MDB路径</param>
/// <param name="strSql">sql语句</param>
/// <param name="zddz"></param>
void CMyPalette1ChildDlg::ReadMDB(const CString& mdbMpPath, const CString& strSql, std::map<CString, CString>& zddz)
{
        if (!AfxOleInit())//这就是初始化COM库
        {
                AfxMessageBox(L"OLE初始化出错!");
                return;
        }
        _ConnectionPtr m_pConnection;

        _RecordsetPtr m_pRecordset;

        //_CommandPtr m_pCommand;

        CString strSQL; //配置初始连接串
        strSQL = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=";
        strSQL += mdbMpPath;
        strSQL += ";";
        HRESULT hr;
        try
        {
                hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
                if (SUCCEEDED(hr))
                {
                        hr = m_pConnection->Open((_bstr_t)strSQL, "", "", adModeUnknown);///连接数据库
                        ///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; }
                        m_pRecordset.CreateInstance("ADODB.Recordset");
                        try
                        {
                                //打开数据库
                                m_pRecordset->Open((_bstr_t)strSql,
                                        m_pConnection.GetInterfacePtr(),//或使用_variant_t((IDispatch*)theApp.m_pConnection,true),,但需要extern声明theApp;
                                        adOpenDynamic,
                                        adLockOptimistic,
                                        adCmdText);
                                //遍历读取

                                while (!m_pRecordset->adoEOF)//adoEOF判断数据库指针是否已经到结果集末尾;BOF判断是否在第一条记录前面
                                {
                                        auto key = m_pRecordset->GetCollect("类型");
                                        //这里已经读到当前记录的ID,需要进行非空等判断,非空之后就可以处理,比如添加到列表框等。
                                        auto value = m_pRecordset->GetCollect("值");
                                        zddz = value;
                                        //....
                                        m_pRecordset->MoveNext();
                                }

                                m_pRecordset->Close();//关闭记录集
                                //m_pRecordset->Release();
                        }
                        catch (_com_error error)
                        {
                                if (m_pRecordset->State) {
                                        m_pRecordset->Close();//关闭记录集
                                        //m_pRecordset->Release();
                                }
                                CString errorMessage;
                                errorMessage.Format(L"%s", (LPTSTR)error.Description());
                                AfxMessageBox(errorMessage);
                                return;
                        }
                        if (m_pConnection->State)//如果连接有效
                        {
                                m_pConnection->Close();
                                //m_pConnection->Release();
                        }
                }
        }
        catch (_com_error e)///捕捉异常
        {
                if (m_pRecordset->State) {
                        m_pRecordset->Close();//关闭记录集
                        //m_pRecordset->Release();
                }
                if (m_pConnection->State)//如果连接有效
                {
                        m_pConnection->Close();
                        //m_pConnection->Release();
                }
                CString errormessage;
                errormessage.Format(L"连接数据库失败!\r\n错误:%s!", e.ErrorMessage());
                AfxMessageBox(errormessage);///显示错误信息
        }
}
页: [1]
查看完整版本: C++ 读取MDB数据库