盾怪网教程:是一个免费提供流行杀毒软件教程、在线学习分享的学习平台!

封装ADO访问数据库的2个类

时间:2025/1/7作者:未知来源:盾怪网教程人气:

[摘要]对于初学者,使用ADO访问数据库的时候,涉及到各种数据类型转换,可能有一些难度,我试图封装了ADO访问数据库,使其更方便的用现有的VC的数据类型,更加方便的使用ADO操作数据库。下面分别提供两个封装...
    对于初学者,使用ADO访问数据库的时候,涉及到各种数据类型转换,可能有一些难度,我试图封装了ADO访问数据库,使其更方便的用现有的VC的数据类型,更加方便的使用ADO操作数据库。
下面分别提供两个封装ADO数据库访问的类,一个是数据库的连接类,一个是数据库字段访问的类。

   在连接类中,大家可以看到,连接类中并没有Recordset的成员变量,因为这样的,在整个数据库应用程序中,数据库的连接一般一个就够了,而同时打开的Reocordset则可能不只一个,所以,如果两个在同一个类里,那么,如果要同时打开两个记录集,需要建立类的两个实例,就是需要同时打开两个数据库连接,如果对于连接的是同一个数据库,同时打开两个连接的话,意味着资源的不必要的浪费。

   数据库字段访问类,简化了,获取数据库字段内容的操作,避免了数据类型转换的麻烦。

   两个类都对错误处理进行了较多的考虑,在访问数据库中,如果没有错误处理,其害处是显而易见的。




#ifndef _BBADOCONNECT_H
#define _BBADOCONNECT_H

//
// ADO访问数据库类
// 软件环境:需要MSADO15.DLL
// 作者:邓振波
// 2001.4.20
// Email:bozi@china.com
// 说明:封装了ADO使用的操作函数和ADO访问数据库错误处理
//  使在VC上方便的使用ADO访问数据库
// 包括:ADO连接数据库、打开记录集、执行SQL、以及
//  事务处理、ADO记录集内容转换成C++的常用数据类型(CString、char,long,float等)
//
// 使用:1。定义一个CBBAdoConnection实例:CBBAdoConnection m_adoConn;
//  2。建立连接:m_adoConn.Open(strConnstring);
//     如果需要无条件重新连接的可以,参数bRepen设成TREU
//  3。打开记录集:
//
//   _RecordsetPtr* prsThis=NULL;
//   prsThis=new _RecordsetPtr;
//   CString strSQL;
//   strSQL="select * from Table_Name";//  
//   如果记录集打开失败
//   

if(!(m_adoConn.OpenRecordset(strSQL,prsThis)))
//    return FALSE;
//  4。建立记录集值对象
//   注意需要用参数构造
//   CBBRstValues rsv(m_adoConn,prsThis);
//  
//  5。获得的字段的值
//   rsv.GetValueLong(&m_nDeptID,1L);//获得第一个字段的值
//   rsv.GetValueStr(m_strName,"ID");//获得第一个字段名为ID的值
//   其它的同理.如果需要获得SQL Server中nText类型的字段值请用
//   GetValText(CString &strText, CString &strFieldName)函数
//  6。记录集的记录移动 (*prsThis)->MoveNext()等类似函数
//  7。记录集不用时候需要释放其资源
//   1)关闭记录集
//   2)删除记录集指针
//   e.g. (*prsThis)->Close();
//     delete prsThis;
//     prsThis=NULL;
//   否则会造成内存泄漏
//  
//  注:
//   1。程序必须要初始化COM环境,请在应用类中加入AfxOleInit函数初始化环境,否则ADO的调用将失败
//   2。如果需要调用存储过程SQL语句改为“Exec ” + 存储过程名即可,与执行SQL同样
//
//                 CopyRight seesi,2001
//
//      说明:你可以随便在的程序中任意使用、修改本代码,但请你不要删除文件头的部分说明。如果需要转载,请注明出处。
// msado15.dll必须放在本文件所在目录,或者自己指定下面的msado15.dll全路径
//

#if !defined(__AFXADO_H)
#import "msado15.dll" no_namespace rename ("EOF", "adoEOF") \
  rename ("LockTypeEnum", "adoLockTypeEnum") \
  rename ("DataTypeEnum", "adoDataTypeEnum") \
  rename ("FieldAttributeEnum",

"adoFieldAttributeEnum") \
  rename ("EditModeEnum", "adoEditModeEnum") \
  rename ("RecordStatusEnum", "adoRecordStatusEnum")

\
  rename ("ParameterDirectionEnum",

"adoParameterDirectionEnum")
#endif  // !defined(__AFXADO_H)


class CBBAdoConnection  
{
public:
CBBAdoConnection();
virtual ~CBBAdoConnection();
public:
int SetConnTimeOut(long lTimeOut); // 设置连接超时
int SetCommTimeOut(long lTimeOut); // 设置命令执行超时
BOOL IsConnectClose(); // 判断连接是否已经打开
int ExecuteSQL(LPCSTR szSQL); // 简单执行SQL语句,不返回记录集
// 打开数据库记录集
// 参数:
//  strSQL  记录集的SQL语句
//  rs   返回的记录集_RecordsetPtr对象
//  sConnString 数据库的连接字符串
//     如果使用数据库连接已经打开,参数没用
//     如果数据库的连接没有打开,当给予一个连接字符串,将先打开数据库连接
BOOL OpenRecordset(CString strSQL, _RecordsetPtr *rs,CString sConnString="");//打开数据库记录集
BOOL OpenRecordset(const char *sSQL,_RecordsetPtr* rs,char* sConnString=NULL);

// 打开数据库连接
// 参数:
//  strConnString 连接字符串
//  sConnString  连接字符串
//  bReOpen   是否重新打开,如果为FALSE,,
//      将先判断数据库是否打开如果没有打开则打开,
//      如果已经打开,将不执行任何操作
//      如果为TRUE,则无条件重新打开。
BOOL OpenConnection(CString strConnString ,BOOL bReOpen=FALSE);
BOOL OpenConnection(char* sConnString,BOOL bReOpen=FALSE); void CloseConnect();// 关闭数据库连接

BOOL ExecuteTrans(CStringArray arrStrSQL); // 事务处理,不返回任何记录集,参数为事务SQL数组


_ConnectionPtr* GetConnection(); // 得到_ConnectionPtr指针
CString GetConnString(); // 得到连接字符串
private:
enum ERRORFrom {
     ErrFormOpenConnsction,
     ErrFromOpenRecordset,
     ErrFormCloseConnection,
     ErrFormTanslation
     };
_ConnectionPtr* m_pConn;
char m_szConnString[512];
///
protected:
void ReportError(int nERRORfrom);
};


class CBBRstValues  
{
public:
// 三种构造类的方法
// 如果无参数构造,请构造后调用InitConnectAndRst方法
// 其他的两种构造则不需调用InitConnectAndRst方法
CBBRstValues();
CBBRstValues(_ConnectionPtr* pConn,_RecordsetPtr* pRs);
CBBRstValues(CBBAdoConnection* pBBadoConn,_RecordsetPtr*

pRs);

virtual ~CBBRstValues();
public:
// 初始化连接队象和记录集对象
void InitConnectAndRst(_ConnectionPtr* pConn,_RecordsetPtr*  pRs);
void InitConnectAndRst(CBBAdoConnection* pBBAdoConn, _RecordsetPtr *  Rs);

// GetValText函数
// 得到数据库nText字段的值
// 参数:
//  strText   用来接收返回值(字段值)
//  strFieldName 字段名,该字段数据类型必须是nText类型
BOOL GetValText(CString& strText,CString& strFieldName); //得到数据库nText字段的值

// GetValueStr函数
// 得到数字型,日期型和字符型字段值函数
// 参数:
//  cVal   用来接收返回值(字段值)的字符串指针,要求要开辟足够的内存单元
//      或者足够容纳字段内容的字符数组。
//  vIndex   数据库字段的名字或者索引,变体型,一般不直接用这个参数,
//      应该用同形式的多态函数的参数调用
//      数据库字段的数据类型可以是数字型,日期型和字符型
//  nFieldLen  需要返回的数据的字符串的长度,如果为-1,则返回整个字段值
//  lpszFieldName 字段名,数据库字段的数据类型可以是数字型,日期型和字符型
//  nFieldIndex  在SQL语句中字段的索引序号数据库字段的数据类型可以是数字型,日期型和字符型

// GetValueLong函数
// 得到数字型,日期型和字符型字段值函数
// 参数:
//  lVal   用来接收返回值(字段值)
//  vIndex   数据库字段的名字或者索引,变体型,一般不直接用这个参数,
//      应该用同形式的多态函数的参数调用
//      数据库字段的数据类型要求是数字型(int,long)
//  lpszFieldName 字段名,数据库字段的数据类型可以是数字型,日期型和字符型
//  nFieldIndex  在SQL语句中字段的索引序号数据库字段的数据类型可以是数字型,日期型和字符型

// GetValueFlaot函数
// 得到数字型,日期型和字符型字段值函数
// 参数:
//  fVal   用来接收返回值(字段值)
//  vIndex   数据库字段的名字或者索引,变体型,一般不直接用这个参数,
//      应该用同形式的多态函数的参数调用
//      数据库字段的数据类型要求是字型(int,long,float,货币型等)
//  lpszFieldName 字段名,数据库字段的数据类型可以是数字型,日期型和字符型
//  nFieldIndex  在SQL语句中字段的索引序号数据库字段的数据类型可以是数字型,日期型和字符型

BOOL GetValueStr(char* cVal,_variant_t &vIndex,int

nFieldLen=-1);
BOOL GetValueLong(long* lVal,_variant_t &vIndex);
BOOL GetValueFloat(float* fVal,_variant_t &vIndex);

BOOL GetValueStr(char* cVal,long lIndex,int nFieldLen=-1);
BOOL GetValueLong(long* lVal,long lIndex);
BOOL GetValueFloat(float* fVal,long lIndex);

BOOL GetValueStr(char* cVal,CString strIndex,int nFieldLen=-1);
GetValueLong(long *lVal, LPCSTR lpszIndex);
BOOL GetValueFloat(float* fVal,CString strIndex);

BOOL GetValueStr(CString& str,LPCSTR lpszFieldName,int nFieldLen=-1);
BOOL GetValueStr(CString& str,UINT nFieldIndex,int nFieldLen=-1);
BOOL GetValueStr(CString& str,_variant_t &vIndex,int nFieldLen=-1);

// 判断值是否有效,是否为NULL
BOOL VerifyVTData(_variant_t& value);
BOOL VerifyVTData(char* pData);
protected:
_RecordsetPtr* m_prsThis;
_ConnectionPtr* m_pConn;
void ReportError();

};

#endif // _BBADOCONNECT_H







////CPP文件

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CBBAdoConnection::CBBAdoConnection()
{
   m_pConn=NULL;
}

_ConnectionPtr* CBBAdoConnection::GetConnection()
{
return m_pConn;
}

CString CBBAdoConnection::GetConnString()
{
return m_szConnString;
}

CBBAdoConnection::~CBBAdoConnection()
{
// 关比连接
CloseConnect();
}

BOOL CBBAdoConnection::OpenConnection(char *sConnString,BOOL bReOpen /*=FALSE*/)
{

// 不需重新打开
if(!bReOpen)
{
  if(m_pConn !=NULL && ((*m_pConn)->State!=adStateClosed))
   return TRUE;  
}

VERIFY(sConnString);
strcpy(m_szConnString,sConnString);

try
{
  m_pConn =new _ConnectionPtr;
  m_pConn->CreateInstance(__uuidof(Connection));
  if(m_pConn==NULL)
   return FALSE;
  HRESULT hr=(*m_pConn)->Open((char*)sConnString,"","",-1);  
  if(FAILED(hr))
   return FALSE;  
  return TRUE;
}
catch(_com_error)
{
  ReportError(ErrFormOpenConnsction);
  return FALSE;
}
catch(...)
{
  #ifdef _DEBUG // 调试时显示相应的错误信息
   MessageBox(NULL,"数据库连接未处理的异常!","连接失败",MB_OK

关键词:封装ADO访问数据库的2个类




Copyright © 2012-2018 盾怪网教程(http://www.dunguai.com) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版