Windows下C++访问数据库(ADO)
2015-08-19 12:07
591 查看
C++利用ADO访问数据库还是比较方便的,我参考网上其它资料,把封装ADO到一个类中,这样调用起来会更加的方便
这个类单线程访问数据库没有问题,提供了查询、增加、删除和修改的接口。
并行访问的话会有问题,另外不能频繁更新数据库,因为更新操作是要访外存的,它和程序后续工作是异步进行的。这里的问题我也会在今后继续完善。
这个类单线程访问数据库没有问题,提供了查询、增加、删除和修改的接口。
并行访问的话会有问题,另外不能频繁更新数据库,因为更新操作是要访外存的,它和程序后续工作是异步进行的。这里的问题我也会在今后继续完善。
//DBAssistant.h #pragma once #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") #include <string> using namespace std; class DBAssistant { public: DBAssistant(); ~DBAssistant(); protected: //数据库连接指针 _ConnectionPtr m_pConnection; _RecordsetPtr m_pResultset; public: bool IsFirstRecord; //是否是第一条记录 //bool IsPrepareStatment; //是否是插入记录状态 public: //连接数据库 bool OpenConnect(_bstr_t url); //数据库查询 // 根据sql查询 bool ExecuteQuery(_bstr_t sql); //结果指针前进一位 bool Next(); // 获取记录总数,如果发生异常返回-1 int GetRecordCount(); // 获取某个域的字符串 _bstr_t GetString(const _bstr_t fieldname); string GetString(int index); string GetString(const char* filedname); //删除 //删除当前记录 bool DelOne(); //删除全部查询出的记录 bool DelAll(); //增加和修改 bool ExecuteAddNew(); bool SetFieldValue(int nIndex, _variant_t fieldValue); bool SetFieldValue(const char* FieldName, _variant_t fieldValue); bool ExecuteUpdate(); //关闭 bool CloseRecordSet(); bool CloseConnection(); };
//DBAssitant.cpp #include "stdafx.h" #include "DBAssistant.h" #include <iostream> using namespace std; DBAssistant::DBAssistant() { IsFirstRecord = true; //IsPrepareStatment = false; CoInitialize(NULL); m_pConnection = NULL; } DBAssistant::~DBAssistant() { IsFirstRecord = false; CloseRecordSet(); CloseConnection(); } bool DBAssistant::OpenConnect(_bstr_t url){ if (m_pConnection != NULL && m_pConnection->State) //如果已经打开,直接返回 return true; try { HRESULT hr = m_pConnection.CreateInstance(__uuidof(Connection)); if (FAILED(hr)) { puts("_ConnectionPtr对象指针实例化失败!"); } _bstr_t connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ url +";Persist Security Info=True"; m_pConnection->Open(connStr, "", "", adModeUnknown); } catch (_com_error e) { puts("数据库连接失败,确认数据库配置正确!"); return false; } return true; } bool DBAssistant::CloseRecordSet() { try { if (m_pResultset != NULL && m_pResultset->State != adStateClosed) { m_pResultset->Close(); m_pResultset.Release(); } } catch (_com_error e) { return false; } return true; } bool DBAssistant::CloseConnection() { try { if (m_pConnection->State != adStateClosed) { m_pConnection->Close(); m_pConnection.Release(); } } catch (_com_error e) { return false; } return true; } // 根据sql查询 bool DBAssistant::ExecuteQuery(_bstr_t sql) { //cout << sql << endl; try { m_pResultset.CreateInstance(__uuidof(Recordset)); m_pResultset->Open(sql, m_pConnection->GetConnectionString(), adOpenStatic, adLockOptimistic, adCmdText); //查询为空 if (m_pResultset->adoEOF) { m_pResultset->Close(); m_pResultset.Release(); return false; } IsFirstRecord = true; } catch (_com_error e) { //cout << "查询出错:" << e.ErrorMessage() << endl; return false; } return true; } // //结果指针前进一位 bool DBAssistant::Next() { try { if (m_pResultset->adoEOF) { return false; } if (IsFirstRecord) { IsFirstRecord = false; } else { m_pResultset->MoveNext(); if (m_pResultset->adoEOF) //加上判断,移到下一条之后,是否是adoEOF return false; } } catch (_com_error e) { cout << "Next出错:" << e.ErrorMessage() << endl; return false; } return true; } // 获取记录总数 int DBAssistant::GetRecordCount() { try { _variant_t fieldvalue = m_pResultset->GetRecordCount(); return fieldvalue.intVal; } catch (_com_error e) { cout << "统计记录数出错:"<<e.ErrorMessage() << endl; return -1; } return 0; } // 获取某个域的字符串 _bstr_t DBAssistant::GetString(_bstr_t fieldname) { try { _variant_t fieldvalue = m_pResultset->GetCollect(fieldname); if (fieldvalue.vt == VT_NULL) return ""; //如果=NULL,则直接转换为"" return fieldvalue; } catch (_com_error e) { cout << "获取域值出错:" << e.ErrorMessage() << endl; } return ""; } string DBAssistant::GetString(const char* filedname){ return _com_util::ConvertBSTRToString(GetString((_bstr_t)filedname)); } string DBAssistant::GetString(int index){ try { _variant_t fieldvalue = m_pResultset->GetCollect(_variant_t((long)index)); if (fieldvalue.vt == VT_NULL) return ""; //如果=NULL,则直接转换为"" return _com_util::ConvertBSTRToString((_bstr_t)fieldvalue); } catch (_com_error e) { cout << "用索引获取域值出错:" << e.Description() << endl; } return ""; } //删除当前记录 bool DBAssistant::DelOne(){ try{ m_pResultset->Delete(adAffectCurrent); } catch (_com_error e){ cout << "删除当前记录出错:" << e.ErrorMessage() << endl; return 0; } return 1; } //删除全部查询出的记录 bool DBAssistant::DelAll(){ try{ while (Next()){ if(DelOne() == 0) return 0; } } catch (_com_error e){ cout << "删除全部记录出错:" << e.ErrorMessage() << endl; return 0; } return 1; } bool DBAssistant::ExecuteAddNew() { try { m_pResultset->AddNew(); } catch (_com_error e) { cout << "增加记录出错:" << e.ErrorMessage() << endl; return false; } return true; } bool DBAssistant::SetFieldValue(int nIndex, _variant_t fieldValue) { try { _variant_t vtIndex; vtIndex.vt = VT_I2; vtIndex.iVal = nIndex; m_pResultset->Fields->GetItem(vtIndex)->Value = fieldValue; } catch (_com_error e) { //cout << "设置记录出错:" << e.ErrorMessage() << endl; return false; } return true; } bool DBAssistant::SetFieldValue(const char* FieldName, _variant_t fieldValue) { try { m_pResultset->Fields->GetItem(FieldName)->Value = fieldValue; } catch (_com_error e) { //cout << "设置记录出错:" << e.ErrorMessage() << endl; return false; } return true; } bool DBAssistant::ExecuteUpdate() { try { m_pResultset->Update(); } catch (_com_error e) { cout << "更新记录出错:" << e.ErrorMessage() << endl; return false; } return true; }
相关文章推荐
- C++封装C#的类库DLL,并c++中C#的string类型的转换使用
- C++ ARGB 和 16进制相互转换
- 如何优化C/C++语言代码(程序员必读)
- 正确使用UDP广播(C++代码)
- c++map的用法
- visual studio与visual c++ 6.0的区别
- 关于visual c++6.0【未完待续】
- C/C++之sizeof与strlen的区别
- VIM C语言函数名高亮
- 技巧:在 C/C++中如何构造通用的对象链表
- C++ 之 Vector(容器)初始化高维数组
- [LeetCode] Group Anagrams
- C语言使用SMTP发送邮件
- C++手稿:函数与参数
- C++手稿:指针与引用
- C++手稿:STL中的函数对象与函数指针
- C++手稿:STL入门
- C++与Java比较之向上转型
- c++标准库—命名空间std和头文件的演变
- 从更为底层的角度看C++