• [转]VC下ADO数据库操作的封装类


    转自:http://www.cppblog.com/changshoumeng/archive/2010/05/12/115216.html

    代码如下:

      1 /******************************************************************
      2  模块名称:数据库操作类;
      3  实现功能:提供接口,实现数据的索引,和操作。
      4  研究人员:长寿梦;
      5  最后更新:2010-05-12
      6 
      7  预先操作:
      8  【1】在stdafx.h中添加
      9     #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
     10  【2】在主进程的InitInstance()中添加
     11          if(!AfxOleInit())
     12         {
     13          AfxMessageBox("OLE初始化错误");
     14          return FALSE;
     15          }
     16 
     17  【3】在.cpp文件中要包含"CPFile.h"
     18 *********************************************************************/
     19 
     20 /*****************************************************************
     21 CPFile.h
     22 ******************************************************************/
     23 class CPData  
     24 {
     25 public:
     26     
     27     //默认初始化构造函数
     28     CPData();
     29     
     30     //传入连接的构造函数
     31     CPData(_ConnectionPtr pConnection);
     32     
     33     //析构函数
     34     virtual ~CPData();
     35 public:
     36     
     37     //连接数据库
     38     BOOL Connect(CString strUser,CString strPassword,CString strFileName="ConnectionParam.udl",int nOptions=-1,CString strConStr="Provider=sqloledb.1;Data Source=(local);Database=VLan");
     39     
     40     //关闭数据库的连接
     41     void DisConnect();
     42     
     43     //数据库查询语句,用来对数据库的各种字段进行查询
     44     //如果成功返回TRUE,否则返回FALSE.查询的结果存储在类的共有成员变量m_pRecordset中
     45     //查询结果的行数和列数分别保存在共有成员变量m_nResultRow和m_nResultCol中
     46     BOOL Select(CString strSql);
     47     
     48     //查询语句,负责对仅仅查询一个字段的情况进行处理
     49     //结果存放在CStringArray类型的变量pResult中
     50     BOOL Select(CString strSql,CStringArray& Result);
     51     
     52     //对多个字段进行查询
     53     BOOL SelectMulitCol(CString strSql,CStringArray& Result);
     54     
     55     //打开表
     56     BOOL OpenTable(CString strTable);
     57     
     58     //打开表
     59     BOOL OpenTable(CString strTable,CStringArray& Result);
     60     
     61     //进行其它的更新操作
     62     BOOL Execute(CString strSql);
     63 public:
     64     BOOL ExecuteTrans(CStringArray& aSql);    
     65     
     66     //关闭结果集合
     67     void CloseRecordset();
     68     
     69     //得到操作结果的列数
     70     long GetResultCol();
     71     
     72     //得到操作结果的条数
     73     long GetResultRow();
     74     
     75     //得到操作结果
     76     _RecordsetPtr GetResult();
     77 private:
     78     
     79     //数据库操作返回的结果条数
     80     long m_nResultRow;
     81     
     82     //返回的_RecordsetPtr中列数
     83     long m_nResultCol;
     84     
     85     //连接指针
     86     _ConnectionPtr m_pConnection;
     87     
     88     //命令执行指针
     89     _CommandPtr m_pCommand;
     90     
     91     //结果集指针
     92     _RecordsetPtr m_pRecordset;
     93 };
     94 
     95 /**************************************************************
     96 CPFile.cpp
     97 **************************************************************/
     98 
     99 //////////////////////////////////////////////////////////////////////
    100 // 构造函数
    101 //////////////////////////////////////////////////////////////////////
    102 //默认的构造函数
    103 CPData::CPData()
    104 {
    105     //初始化
    106     m_nResultRow = 0;
    107     m_nResultCol=0;
    108     m_pConnection = NULL;
    109     //创建对象
    110     m_pRecordset.CreateInstance(_uuidof(Recordset));
    111     m_pCommand.CreateInstance(_uuidof(Command)); 
    112 }
    113 
    114 //传入参数的构造函数
    115 CPData::CPData(_ConnectionPtr pConnection)
    116 {
    117     m_pConnection = pConnection; 
    118     m_nResultRow = 0;
    119     m_nResultCol=0;
    120     //创建对象
    121     m_pRecordset.CreateInstance(_uuidof(Recordset));
    122     m_pCommand.CreateInstance(_uuidof(Command)); 
    123     
    124 }
    125 //////////////////////////////////////////////////////////////////////
    126 // 析构函数
    127 //////////////////////////////////////////////////////////////////////
    128 CPData::~CPData()
    129 { 
    130     if(m_pRecordset->State!=adStateClosed)
    131         m_pRecordset->Close();
    132     m_pRecordset = NULL;
    133 
    134     if(m_pCommand->State!=adStateClosed)
    135         m_pCommand->Release();
    136     m_pCommand = NULL;
    137 
    138     if(m_pConnection->State!=adStateClosed) 
    139         m_pConnection->Close();
    140     m_pConnection = NULL; 
    141 }
    142 
    143 /////////////////////////////////////////////////////////////////////
    144 ///简单操作函数
    145 ////////////////////////////////////////////////////////////////////
    146 
    147 //得到操作结果的行数
    148 long CPData::GetResultRow()
    149 {
    150     return this->m_nResultRow;
    151 }
    152 
    153 //得到操作结果的列数
    154 long CPData::GetResultCol()
    155 {
    156     return this->m_nResultCol;
    157 }
    158 
    159 //得到操作结果
    160 _RecordsetPtr CPData::GetResult()
    161 {
    162     return this->m_pRecordset;
    163 }
    164 
    165 ///////////////////////////////////////////////////////////////////////
    166 ///连接操作
    167 ///////////////////////////////////////////////////////////////////////
    168 
    169 //连接到数据库
    170 //1.连接字符串可以自己构造,也可以从文件中读出
    171 BOOL CPData::Connect(CString strUser,CString strPassword,CString strFileName,int nOptions,CString strConStr)
    172 {
    173     try{ 
    174         m_pConnection.CreateInstance(__uuidof(Connection));
    175         HRESULT hr;
    176         //如果用文件方式配置数据源,进行配置
    177         if(strFileName.Compare("")!=0&&CPFile::IsFileExist(strFileName))
    178         {
    179             CString con = "File Name="+strFileName;
    180             m_pConnection->ConnectionString =(_bstr_t)con;
    181             hr=m_pConnection->Open("","","",nOptions);    
    182         }
    183         else
    184         {
    185             //自己配置连接字符串
    186             m_pConnection->ConnectionString = (_bstr_t)strConStr;
    187             hr=m_pConnection->Open("",_bstr_t(strUser),_bstr_t(strPassword),nOptions);  
    188         }
    189         //进行连接
    190         //连接失败
    191         if(FAILED(hr))
    192         {   
    193             AfxMessageBox("连接失败!");
    194             return FALSE;
    195         }
    196     }
    197     catch(_com_error&e)
    198     {
    199         AfxMessageBox(e.Description()+"B");
    200         return FALSE;
    201     } 
    202     return TRUE;
    203 }
    204 
    205 //断开连接
    206 void CPData::DisConnect()
    207 {
    208     if(m_pConnection->State!=adStateClosed)
    209         m_pConnection->Close(); 
    210 }
    211 
    212 ///////////////////////////////////////////////////////////////////////
    213 ///更新操作
    214 ///////////////////////////////////////////////////////////////////////
    215 BOOL CPData::Execute(CString strSql)
    216 {
    217     try
    218     {
    219         _variant_t vNULL;
    220         vNULL.vt = VT_ERROR;
    221         
    222         ///定义为无参数
    223         vNULL.scode = DISP_E_PARAMNOTFOUND;
    224         
    225         ///非常关键的一句,将建立的连接赋值给它
    226         m_pCommand->ActiveConnection = m_pConnection;
    227         
    228         ///命令字串
    229         m_pCommand->CommandText = (_bstr_t)strSql;
    230         
    231         ///执行命令,取得记录集
    232         m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
    233         
    234         //确实,vNULL中的intVal是执行操作所影响的行数
    235         m_nResultRow = 0;
    236         m_nResultRow = vNULL.intVal;  
    237     }
    238     catch(_com_error&e)
    239     {
    240         m_nResultRow = 0;  
    241         return FALSE;
    242     }
    243     return TRUE;
    244 }
    245 
    246 ///////////////////////////////////////////////////////////////////////
    247 ///查询操作
    248 ///////////////////////////////////////////////////////////////////////
    249 BOOL CPData::Select(CString strSql)
    250 {
    251     try
    252     {
    253         m_nResultCol=0;
    254         m_nResultRow=0;  
    255         m_pRecordset->CursorLocation=adUseClient;    //设置游标位置,设置为客户端形式,否则GetRecordCount()返回值不对
    256         m_pRecordset->Open(_variant_t(strSql),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
    257         m_nResultCol = m_pRecordset->Fields->GetCount();//得到查询结果的列数
    258         m_nResultRow = m_pRecordset->GetRecordCount();  //得到查询结果的行数
    259     }
    260     catch(_com_error&e)
    261     {  
    262         AfxMessageBox(e.Description()+"D");
    263         return FALSE;
    264     }
    265     return TRUE;
    266 }
    267 
    268 //查询语句,负责对仅仅查询一个字段的情况进行处理
    269 //结果存放在CStringArray类型的变量pResult中
    270 BOOL CPData::Select(CString strSql,CStringArray& Result)
    271 {
    272     if(Select(strSql)!=0)
    273     {
    274         Result.RemoveAll();
    275         for(int i=0;i<m_nResultRow;i++)
    276         {
    277             _variant_t value;
    278             value=m_pRecordset->Fields->Item[(long)0]->Value;   
    279             if(value.vt==3||value.vt==14)
    280             {
    281                 CString strTrans;
    282                 strTrans.Format("%ld",value.intVal);
    283                 Result.Add(strTrans);
    284             }
    285             else
    286                 Result.Add(value.bstrVal);//
    287             m_pRecordset->MoveNext();
    288         }
    289         m_pRecordset->Close();
    290         return TRUE;
    291     }
    292     else
    293     {
    294         m_pRecordset->Close();
    295         return FALSE;
    296     }
    297 }
    298 
    299 BOOL CPData::SelectMulitCol(CString strSql,CStringArray& Result)
    300 {
    301     if(Select(strSql)!=0)
    302     {
    303         Result.RemoveAll();
    304         _variant_t value;
    305         for(int i=0;i<m_nResultRow;i++)
    306         {   
    307             for(int j=0;j<m_nResultCol;j++)
    308             {
    309                 value=m_pRecordset->Fields->Item[(long)(/*i*m_nResultCol+*/j)]->Value;
    310                 if(value.vt==3||value.vt==14)
    311                 {
    312                     CString strTrans;
    313                     strTrans.Format("%ld",value.intVal);
    314                     Result.Add(strTrans);
    315                 }
    316                 else
    317                     if(value.vt==7)
    318                     {
    319                         COleDateTime time = value.date;
    320                         CString strTemp;
    321                         strTemp.Format("%d-%d-%d %s",time.GetYear(),time.GetMonth(),time.GetDay(),time.Format("%H:%M:%S"));
    322                         Result.Add(strTemp);
    323                     }
    324                     else
    325                         Result.Add(value.bstrVal);//
    326             }
    327             m_pRecordset->MoveNext();
    328         }
    329         m_pRecordset->Close();
    330         return TRUE;
    331     }
    332     else
    333     { 
    334         m_pRecordset->Close();
    335         return FALSE;
    336     }
    337 }
    338 
    339 //打开整张表
    340 BOOL CPData::OpenTable(CString strTable)
    341 {
    342     try
    343     {
    344         m_nResultCol=0;
    345         m_nResultRow=0;  
    346         m_pRecordset->CursorLocation=adUseClient;    //设置游标位置,设置为客户端形式,否则GetRecordCount()返回值不对
    347         m_pRecordset->Open(_variant_t(strTable),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdTable);
    348         m_nResultCol = m_pRecordset->Fields->GetCount();//得到查询结果的列数
    349         m_nResultRow = m_pRecordset->GetRecordCount();  //得到查询结果的行数
    350     }
    351     catch(_com_error&e)
    352     {  
    353         AfxMessageBox(e.Description()+"E");
    354         return FALSE;
    355     }
    356     return TRUE;
    357 }
    358 
    359 BOOL CPData::OpenTable(CString strTable,CStringArray& Result)
    360 {
    361     if(OpenTable(strTable)!=0)
    362     {
    363         Result.RemoveAll();
    364         _variant_t value;
    365         for(int i=0;i<m_nResultRow;i++)
    366         {   
    367             for(int j=0;j<m_nResultCol;j++)
    368             {
    369                 value=m_pRecordset->Fields->Item[(long)(/*i*m_nResultCol+*/j)]->Value;
    370                 if(value.vt==3||value.vt==14)
    371                 {
    372                     CString strTrans;
    373                     strTrans.Format("%ld",value.intVal);
    374                     Result.Add(strTrans);
    375                 }
    376                 else
    377                     if(value.vt==7)
    378                     {
    379                         COleDateTime time = value.date;
    380                         CString strTemp;
    381                         strTemp.Format("%d-%d-%d %s",time.GetYear(),time.GetMonth(),time.GetDay(),time.Format("%H:%M:%S"));
    382                         Result.Add(strTemp);
    383                     }
    384                     else
    385                         Result.Add(value.bstrVal);//
    386             }
    387             m_pRecordset->MoveNext();
    388         }
    389         m_pRecordset->Close();
    390         return TRUE;
    391     }
    392     else
    393     {
    394         return FALSE;
    395     }
    396 }
    397 
    398 /////////////////////////////////////////////////////////////////////////////
    399 ///关闭结果集
    400 /////////////////////////////////////////////////////////////////////////////
    401 void CPData::CloseRecordset()
    402 {
    403     if(m_pRecordset->State != adStateClosed)
    404         m_pRecordset->Close();
    405 }
    406 BOOL CPData::ExecuteTrans(CStringArray& aSql)
    407 {
    408     try{
    409         int nNum = aSql.GetSize();
    410         m_pConnection->BeginTrans(); 
    411         for(int i=0;i<nNum;i++)
    412         {
    413             CString strSql = aSql.GetAt(i);  
    414             m_pConnection->Execute((_bstr_t)aSql.GetAt(i),NULL,adCmdText);
    415         }
    416         m_pConnection->CommitTrans(); 
    417         return TRUE;
    418     }
    419     catch(_com_error& e)
    420     {
    421         m_pConnection->RollbackTrans();  
    422         AfxMessageBox(e.Description()+"F");
    423         return FALSE;
    424     } 
    425 }
  • 相关阅读:
    EMIF接口的寻址问题
    C6000系类的内联函数
    C6000代码层面优化(一)
    RHCE学习笔记
    找出并关闭Ruby On Rails进程.
    Rails4添加bootstrap支持
    如何删除gnome3面板上的图标?
    出现 ruby cannot load such file -- zlib 问题的解决方法
    Debian安装软件时提示插入光盘
    Debian7桌面屏蔽图标和右键菜单的解决方法。
  • 原文地址:https://www.cnblogs.com/cnmyp/p/2624369.html
Copyright © 2020-2023  润新知