ADO封装类的实现

声明:

//
/用来访问数据库的类。要用次类的话,程序中应该进行的初始化工作为:
/在stdafx.h中包含下面一句,用来将ado的dll文件引入到程序中:
/#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("EOF","adoEOF")
/在主进程的InitInstance()中要添加的语句,用来初始化ole
/ if(!AfxOleInit())
/ {
/  AfxMessageBox("OLE初始化错误");
/  return FALSE;
/ }
/
关于m_pRecordset指针的释放问题
在.cpp文件中要包含"CPFile.h"
///
class CPData 
{
public:

 //默认初始化构造函数
 CPData();

 //传入连接的构造函数
 CPData(_ConnectionPtr pConnection);

 //析构函数
 virtual ~CPData();
public:

 //连接数据库
 BOOL Connect(CString strUser,CString strPassword,CString strFileName="ConnectionParam.udl",int nOptions=-1,CString strConStr="Provider=sqloledb.1;Data Source=(local);Database=VLan");

 //关闭数据库的连接
 void DisConnect();

 //数据库查询语句,用来对数据库的各种字段进行查询
 //如果成功返回TRUE,否则返回FALSE.查询的结果存储在类的共有成员变量m_pRecordset中
 //查询结果的行数和列数分别保存在共有成员变量m_nResultRow和m_nResultCol中
 BOOL Select(CString strSql);

 //查询语句,负责对仅仅查询一个字段的情况进行处理
 //结果存放在CStringArray类型的变量pResult中
 BOOL Select(CString strSql,CStringArray& Result);
 
 //对多个字段进行查询
 BOOL SelectMulitCol(CString strSql,CStringArray& Result);
 
 //打开表
 BOOL OpenTable(CString strTable);

 //打开表
 BOOL OpenTable(CString strTable,CStringArray& Result);

 //进行其它的更新操作
 BOOL Execute(CString strSql);
public:
 BOOL ExecuteTrans(CStringArray& aSql);
 
 

 //关闭结果集合
 void CloseRecordset();

 //得到操作结果的列数
 long GetResultCol();

 //得到操作结果的条数
 long GetResultRow();

 //得到操作结果
 _RecordsetPtr GetResult();
private:
 
 //数据库操作返回的结果条数
 long m_nResultRow;

 //返回的_RecordsetPtr中列数
 long m_nResultCol;

 //连接指针
 _ConnectionPtr m_pConnection;

 //命令执行指针
 _CommandPtr m_pCommand;

 //结果集指针
 _RecordsetPtr m_pRecordset;
};

实现:

//
// 构造函数
//

//默认的构造函数
CPData::CPData()
{
 m_pConnection = NULL;
 
 //初始化
 m_nResultRow = 0;
 m_nResultCol=0;

 //创建对象
 m_pRecordset.CreateInstance(_uuidof(Recordset));
 m_pCommand.CreateInstance(_uuidof(Command)); 
}

//传入参数的构造函数
CPData::CPData(_ConnectionPtr pConnection)
{
 m_pConnection = pConnection; 
 m_nResultRow = 0;
 m_nResultCol=0;
 //创建对象
 m_pRecordset.CreateInstance(_uuidof(Recordset));
 m_pCommand.CreateInstance(_uuidof(Command)); 

}
//
// 析构函数
//
CPData::~CPData()

 if(m_pRecordset->State!=adStateClosed)
  m_pRecordset->Close();
 m_pRecordset = NULL;
 if(m_pCommand->State!=adStateClosed)
  m_pCommand->Release();
 m_pCommand = NULL;
 if(m_pConnection->State!=adStateClosed) //如果连接还没有关闭
  m_pConnection->Close();
 m_pConnection = NULL; 
}

/
///简单操作函数

//得到操作结果的行数
long CPData::GetResultRow()
{
 return this->m_nResultRow;
}

//得到操组结果的列数
long CPData::GetResultCol()
{
 return this->m_nResultCol;
}

//得到操作结果
_RecordsetPtr CPData::GetResult()
{
 return this->m_pRecordset;
}

///
///连接操作
///

//连接到数据库
//1.连接字符串可以自己构造,也可以从文件中读出
BOOL CPData::Connect(CString strUser,CString strPassword,CString strFileName,int nOptions,CString strConStr)
{
 try{ 
  m_pConnection.CreateInstance(__uuidof(Connection));
  HRESULT hr;
  //如果用文件方式配置数据源,进行配置
  if(strFileName.Compare("")!=0&&CPFile::IsFileExist(strFileName))
  {
   CString con = "File Name="+strFileName;
   m_pConnection->ConnectionString =(_bstr_t)con;
   hr=m_pConnection->Open("","","",nOptions);   
  }
  else
  {
   //自己配置连接字符串
   m_pConnection->ConnectionString = (_bstr_t)strConStr;
   hr=m_pConnection->Open("",_bstr_t(strUser),_bstr_t(strPassword),nOptions);  
  }
  //进行连接
  //连接失败
  if(FAILED(hr))
  {  
   AfxMessageBox("连接失败!");
   return FALSE;
  }
 }
 catch(_com_error&e)
 {
  AfxMessageBox(e.Description()+"B");
  return FALSE;
 } 
 return TRUE;
}

//断开连接
void CPData::DisConnect()
{
 if(m_pConnection->State!=adStateClosed)
  m_pConnection->Close(); 
}

///
///更新操作
///
BOOL CPData::Execute(CString strSql)
{
 try
 {
  _variant_t vNULL;
  vNULL.vt = VT_ERROR;

  ///定义为无参数
  vNULL.scode = DISP_E_PARAMNOTFOUND;

  ///非常关键的一句,将建立的连接赋值给它
  m_pCommand->ActiveConnection = m_pConnection;

  ///命令字串
  m_pCommand->CommandText = (_bstr_t)strSql;

  ///执行命令,取得记录集
  m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);

  //确实,vNULL中的intVal是执行操作所影响的行数
  m_nResultRow = 0;
  m_nResultRow = vNULL.intVal; 
 }
 catch(_com_error&e)
 {
  m_nResultRow = 0;  
  return FALSE;
 }
 return TRUE;
}
///
///查询操作
///

BOOL CPData::Select(CString strSql)
{
 try
 {
  m_nResultCol=0;
  m_nResultRow=0;  
  m_pRecordset->CursorLocation=adUseClient;    //设置游标位置,设置为客户端形式,否则GetRecordCount()返回值不对
  m_pRecordset->Open(_variant_t(strSql),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
  m_nResultCol = m_pRecordset->Fields->GetCount();//得到查询结果的列数
   m_nResultRow = m_pRecordset->GetRecordCount();  //得到查询结果的行数
 }
 catch(_com_error&e)
 {  
  AfxMessageBox(e.Description()+"D");
  return FALSE;
 }
 return TRUE;
}

//查询语句,负责对仅仅查询一个字段的情况进行处理
//结果存放在CStringArray类型的变量pResult中
BOOL CPData::Select(CString strSql,CStringArray& Result)
{
 if(Select(strSql)!=0)
 {
  Result.RemoveAll();
  for(int i=0;i<m_nResultRow;i++)
  {
   _variant_t value;
   value=m_pRecordset->Fields->Item[(long)0]->Value;   
   if(value.vt==3||value.vt==14)
    {
     CString strTrans;
     strTrans.Format("%ld",value.intVal);
     Result.Add(strTrans);
    }
    else
    Result.Add(value.bstrVal);//
   m_pRecordset->MoveNext();
  }
  m_pRecordset->Close();
  return TRUE;
 }
 else
 {
  m_pRecordset->Close();
  return FALSE;
 }
}

BOOL CPData::SelectMulitCol(CString strSql,CStringArray& Result)
{
 if(Select(strSql)!=0)
 {
  Result.RemoveAll();
  _variant_t value;
  for(int i=0;i<m_nResultRow;i++)
  {   
   for(int j=0;j<m_nResultCol;j++)
   {
    value=m_pRecordset->Fields->Item[(long)(/*i*m_nResultCol+*/j)]->Value;
    if(value.vt==3||value.vt==14)
    {
     CString strTrans;
     strTrans.Format("%ld",value.intVal);
     Result.Add(strTrans);
    }
    else
     if(value.vt==7)
     {
      COleDateTime time = value.date;
      CString strTemp;
      strTemp.Format("%d-%d-%d %s",time.GetYear(),time.GetMonth(),time.GetDay(),time.Format("%H:%M:%S"));
      Result.Add(strTemp);
     }
     else
      Result.Add(value.bstrVal);//
   }
   m_pRecordset->MoveNext();
  }
  m_pRecordset->Close();
  return TRUE;
 }
 else
 { 
  m_pRecordset->Close();
  return FALSE;
 }
}

//打开整张表
BOOL CPData::OpenTable(CString strTable)
{
 try
 {
  m_nResultCol=0;
  m_nResultRow=0;  
  m_pRecordset->CursorLocation=adUseClient;    //设置游标位置,设置为客户端形式,否则GetRecordCount()返回值不对
  m_pRecordset->Open(_variant_t(strTable),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdTable);
  m_nResultCol = m_pRecordset->Fields->GetCount();//得到查询结果的列数
   m_nResultRow = m_pRecordset->GetRecordCount();  //得到查询结果的行数
 }
 catch(_com_error&e)
 {  
  AfxMessageBox(e.Description()+"E");
  return FALSE;
 }
 return TRUE;
}

BOOL CPData::OpenTable(CString strTable,CStringArray& Result)
{
 if(OpenTable(strTable)!=0)
 {
  Result.RemoveAll();
  _variant_t value;
  for(int i=0;i<m_nResultRow;i++)
  {   
   for(int j=0;j<m_nResultCol;j++)
   {
    value=m_pRecordset->Fields->Item[(long)(/*i*m_nResultCol+*/j)]->Value;
    if(value.vt==3||value.vt==14)
    {
     CString strTrans;
     strTrans.Format("%ld",value.intVal);
     Result.Add(strTrans);
    }
    else
     if(value.vt==7)
     {
      COleDateTime time = value.date;
      CString strTemp;
      strTemp.Format("%d-%d-%d %s",time.GetYear(),time.GetMonth(),time.GetDay(),time.Format("%H:%M:%S"));
      Result.Add(strTemp);
     }
     else
      Result.Add(value.bstrVal);//
   }
   m_pRecordset->MoveNext();
  }
  m_pRecordset->Close();
  return TRUE;
 }
 else
 {
  return FALSE;
 }
}

/
///关闭结果集
/
void CPData::CloseRecordset()
{
 if(m_pRecordset->State != adStateClosed)
  m_pRecordset->Close();
}
BOOL CPData::ExecuteTrans(CStringArray& aSql)
{
 try{
 int nNum = aSql.GetSize();
 m_pConnection->BeginTrans(); 
 for(int i=0;i<nNum;i++)
 {
  CString strSql = aSql.GetAt(i);  
  m_pConnection->Execute((_bstr_t)aSql.GetAt(i),NULL,adCmdText);
 }
 m_pConnection->CommitTrans(); 
 return TRUE;
 }
 catch(_com_error& e)
 {
  m_pConnection->RollbackTrans();  
  AfxMessageBox(e.Description()+"F");
  return FALSE;
 } 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值