ADO库的简单封装使用
来源:互联网 发布:阿里云推送怎么样 编辑:程序博客网 时间:2024/05/16 18:42
最近学习使用数据库,开始使用的ADO,后来改用ODBC。现在将自己写的结合网上的ADO写了一个简单的封装类。
#pragma onceclass CDBOperator{public: CDBOperator(void); ~CDBOperator(void); // 打开数据库连接 输入DSN名称、用户和密码 BOOL OpenDataBase(CString strDsnName, CString strUserID, CString strPassword); // 执行SQL查询语句,结果放在数据pData中 // 执行失败返回值<0,可通过GetErrorMessage获得出错信息 int Select(CString strSql); // 执行sql语句 // 执行失败返回值<0,可通过GetErrorMessage获得出错信息 int Excute(CString strSql); // 关闭数据库连接 BOOL CloseDataBase(); // 获取错误信息 CString GetErrorMessage();public: int m_nResultRow; // 查询结果行数 int m_nResultCol; // 查询结果列数 CStringArray m_pData; // 将查询结果全部转换为字符串 大小nRow*nCol // m_pData[i*m_nResultCol+j]; CString m_strErrorMessage; // 出错信息//private: _ConnectionPtr m_pConnection; // 数据库连接指针 _RecordsetPtr m_pRecordset; // 记录集 CString m_strDsnName; // 连接字符串 CString m_strUserID; // 用户ID CString m_strPassword; // 密码 };
下面是实现
#include "StdAfx.h"#include "DBOperator.h"CDBOperator::CDBOperator(void): m_pConnection(NULL), m_pRecordset(NULL), m_nResultRow(0), m_nResultCol(0){}CDBOperator::~CDBOperator(void){ if ( m_pRecordset ) { m_pRecordset->Close(); m_pRecordset = NULL; } if ( m_pConnection ) { m_pConnection->Close(); m_pConnection = NULL; }}BOOL CDBOperator::OpenDataBase(CString strDsnName, CString strUserID, CString strPassword){ m_strDsnName = strDsnName; m_strUserID = strUserID; m_strPassword = strPassword; CoInitialize(NULL); m_pConnection.CreateInstance(__uuidof(Connection)); try { m_pConnection->ConnectionTimeout = 5; HRESULT hr = m_pConnection->Open((_bstr_t)strDsnName, (_bstr_t)strUserID, (_bstr_t)strPassword, adModeUnknown); //HRESULT hr = m_pConnection->Open("DSN=MySqlODBC;Server=localhost;database=mes","root","123456",adModeUnknown); } catch (_com_error& e) { m_strErrorMessage = (LPCTSTR)e.Description(); return FALSE; } return TRUE;}int CDBOperator::Select(CString Sql){ if ( m_pRecordset != NULL ) { m_pRecordset->Close(); m_pRecordset = NULL; } // 创建记录集对象实例 int i = 0, j = 0; HRESULT hr = m_pRecordset.CreateInstance("ADODB.Recordset"); if ( !SUCCEEDED(hr) ) { m_strErrorMessage = _T("Recordset CreateInstance failed!"); return -1; } try { // 打开记录集 hr = m_pRecordset->Open(Sql.GetBuffer(Sql.GetLength()), _variant_t((IDispatch*)m_pConnection, true), adOpenUnspecified, adLockUnspecified, adCmdText); // 获得记录集总列数 m_nResultCol = m_pRecordset->Fields->GetCount(); if ( m_pRecordset->adoEOF ) { return 0; } else { m_pRecordset->MoveFirst(); } while ( !m_pRecordset->adoEOF ) { _variant_t vValue, vValue1; CString str; // 取一列数据 for ( j=0; j<m_nResultCol; j++ ) { str.Empty(); // 取得当前记录字段数据 vValue = m_pRecordset->Fields->Item[(long)j]->Value; // 数据非空 if ( vValue.vt != 1 ) { int type = vValue.vt; // 转换数据类型(为字符串) if (VariantChangeType(&vValue1, &vValue, 0, VT_BSTR) == S_OK ) { str = vValue1.bstrVal; } } // 动态设置数值大小 if (m_pData.GetSize()<i*m_nResultCol+j+1) { m_pData.SetSize(i*m_nResultCol+j+1); } // 保存结果到数组中 m_pData[i*m_nResultCol+j] = str; } // 移动记录集指针到下一行 m_pRecordset->MoveNext(); i++; } m_pRecordset->Close(); m_pRecordset = NULL; m_nResultRow = i; } catch (_com_error e) // 捕捉异常 { m_strErrorMessage = (LPCTSTR)e.Description(); m_pRecordset = NULL; return -1; } // 释放多余的内存空间 m_pData.FreeExtra(); return m_nResultRow;}int CDBOperator::Excute(CString Sql){ _variant_t RecordsAffected; try { // 是否已经连接数据库 if(m_pConnection == NULL) { m_strErrorMessage = _T("empty database!"); return -1; } // Connection对象的Execute方法:(_bstr_t CommandText, // VARIANT * RecordsAffected, long Options ) // 其中CommandText是命令字串,通常是SQL命令。 // 参数RecordsAffected是操作完成后所影响的行数, // 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名 // adCmdProc-存储过程;adCmdUnknown-未知 _RecordsetPtr hr = m_pConnection->Execute((_bstr_t)Sql, &RecordsAffected, adCmdText); return 1; } catch(_com_error e) { m_strErrorMessage = (LPCTSTR)e.Description(); return -1; }}CString CDBOperator::GetErrorMessage(){ return m_strErrorMessage;}BOOL CDBOperator::CloseDataBase(){ if ( m_pRecordset ) { m_pRecordset->Close(); m_pRecordset = NULL; } if ( m_pConnection ) { m_pConnection->Close(); m_pConnection = NULL; } m_pData.RemoveAll(); return TRUE;}
该封装主要是把从数据库中读出来的数据全转变为字符串了。可以自己操纵_variant_t去进行具体的转换。。。
当然别忘了在StdAfx.h文件中添加如下代码
#import "msadox.dll"#import "msado15.dll" no_namespace rename("EOF", "adoEOF")
- ADO库的简单封装使用
- 简单的ADO.NET封装
- 我封装的一个ADO类,使用超简单!
- ADO简单封装类
- ADO.NET之SQLHelper类的简单封装
- Jtable简单的封装使用
- RecyclerView 使用的简单封装
- BroadcastReceiver的简单封装使用
- okHttp的简单封装使用
- Retrofit的简单封装使用
- 使用ADO封装类的数据库程序开发实例
- 使用ADO封装类的数据库程序开发实例
- 使用ADO封装类的数据库程序开发实例(上)
- 使用ADO封装类的数据库程序开发实例
- 使用ADO封装类的数据库程序开发实例
- 使用ADO封装类的数据库程序开发实例(上)
- 使用ADO封装类的数据库程序开发实例(下)
- 使用ADO封装类的数据库程序开发实例
- 数据存储技术笔记(持续更新)
- 深入浅出设计模式(14)——Interpreter模式
- 对比SVN学习GIT版本管理工具
- Android数据存储之文件存储
- 深入浅出设计模式(15)——Iterator模式
- ADO库的简单封装使用
- 周永康赴四川考察成都中院及公安局等政法部门-周永康-政法建设-成都中院
- 将1、2、...、20这20个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数。
- Flash download failed-"Cortex-M3"的原因及解决办法
- js打印网页功能大全
- 一个关于指针的问题 int (**def)[3]的解析
- 莫言家人回应陈光标赠送别墅:不食嗟来之食-陈光标-别墅-莫言
- 深入浅出设计模式(16)——Mediator模式
- 常用端口介绍