vc++ ado访问类 CAdoAcc.h

来源:互联网 发布:债券承销 知乎 编辑:程序博客网 时间:2024/05/24 07:43
// AdoAcc.h: interface for the CAdoAcc class.
/******************************************************************
  模块名称:数据库操作类;
  实现功能:实现数据查询、插入、删除等操作,提供对sqlserver和oracle的联接方式。
  研究人员:姜广新
  最后更新:2017-11-15
 
  预先操作:
  【1】在stdafx.h中添加
     #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
  【2】在主进程的InitInstance()中添加
          if(!AfxOleInit())
         {
          AfxMessageBox("OLE初始化错误");
          return FALSE;
          }
 
  【3】在.cpp文件中要包含"AdoAcc.h"
 *********************************************************************/


//////////////////////////////////////////////////////////////////////


#if !defined(AFX_ADOACC_H__45108404_3E89_4952_85C6_16954F5CA80E__INCLUDED_)
#define AFX_ADOACC_H__45108404_3E89_4952_85C6_16954F5CA80E__INCLUDED_


#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


class CAdoAcc  
{
public:
CAdoAcc();
    CAdoAcc(_ConnectionPtr pConnection);
virtual ~CAdoAcc();
public:
     //连接数据库
     BOOL Connect(CString strUser,CString strPassword,CString strFileName="ConnectionParam.udl",int nOptions=-1,CString strConStr="Provider=sqloledb.1;Data Source=(local);Database=VLan");
     BOOL ConnectSqlserver(CString Server,CString db,CString User,CString Password);
     BOOL ConnectOracle(CString Datasource,CString Userid,CString Password);
//关闭数据库的连接
     void DisConnect();
//数据库查询语句,用来对数据库的各种字段进行查询
     //如果成功返回TRUE,否则返回FALSE.查询的结果存储在类的共有成员变量m_pRecordset中
     //查询结果的行数和列数分别保存在共有成员变量m_nResultRow和m_nResultCol中
CString GetValues(CString columnName);
CString GetValues(int col);
int GetInt(CString columnName);


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


     BOOL Select(CString strSql,CStringArray& Result);
     
      //对多个字段进行查询
     BOOL SelectMulitCol(CString strSql,CStringArray& Result);
     
     //打开表
     BOOL OpenTable(CString strTable);
     BOOL Open(CString sql);
     //打开表
     BOOL OpenTable(CString strTable,CStringArray& Result);
     
     //进行其它的更新操作
     BOOL Execute(CString strSql);
 public:
void CloseCommand();
BOOL AdoEOF();
void MoveNext();
     BOOL ExecuteTrans(CStringArray& aSql);    
     
     //关闭结果集合
     void CloseRecordset();
     
     //得到操作结果的列数
     long GetResultCol();
     
     //得到操作结果的条数
     long GetResultRow();
     
     //得到操作结果
     _RecordsetPtr GetResult();


     //连接指针
     _ConnectionPtr m_pConnection;
 private:
     
     //数据库操作返回的结果条数
     long m_nResultRow;
     
     //返回的_RecordsetPtr中列数
     long m_nResultCol;
     
     //命令执行指针
     _CommandPtr m_pCommand;
     
     //结果集指针
     _RecordsetPtr m_pRecordset;
 };








#endif // !defined(AFX_ADOACC_H__45108404_3E89_4952_85C6_16954F5CA80E__INCLUDED_)



// AdoAcc.cpp: implementation of the CAdoAcc class.
//
//////////////////////////////////////////////////////////////////////


#include "stdafx.h"
#include "AdoAcc.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


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


CAdoAcc::CAdoAcc()
 {
     //初始化
     m_nResultRow = 0;
     m_nResultCol=0;
     m_pConnection = NULL;
     //创建对象
     m_pRecordset.CreateInstance(_uuidof(Recordset));
     m_pCommand.CreateInstance(_uuidof(Command)); 
 }
 
 //传入参数的构造函数
 CAdoAcc::CAdoAcc(_ConnectionPtr pConnection)
 {
     m_pConnection = pConnection; 
     m_nResultRow = 0;
     m_nResultCol=0;
     //创建对象
     m_pRecordset.CreateInstance(_uuidof(Recordset));
     m_pCommand.CreateInstance(_uuidof(Command)); 
     
 }
 //////////////////////////////////////////////////////////////////////
 // 析构函数
 //////////////////////////////////////////////////////////////////////
 CAdoAcc::~CAdoAcc()
 { 


 }
 
 /////////////////////////////////////////////////////////////////////
 ///简单操作函数
 ////////////////////////////////////////////////////////////////////
 
 //得到操作结果的行数
 long CAdoAcc::GetResultRow()
 {
     return this->m_nResultRow;
 }
 
 //得到操作结果的列数
 long CAdoAcc::GetResultCol()
 {
     return this->m_nResultCol;
 }
 
 //得到操作结果
 _RecordsetPtr CAdoAcc::GetResult()
 {
     return this->m_pRecordset;
 }
 
 ///////////////////////////////////////////////////////////////////////
 ///连接操作
 ///////////////////////////////////////////////////////////////////////
 
 //连接到数据库
 //1.连接字符串可以自己构造,也可以从文件中读出
 BOOL CAdoAcc::Connect(CString strUser,CString strPassword,CString strFileName,int nOptions,CString strConStr)
 {
     try{ 
         m_pConnection.CreateInstance(__uuidof(Connection));
         HRESULT hr;
         //如果用文件方式配置数据源,进行配置
         if(strFileName.Compare("")!=0)
         {
             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;
 }
 /*
_bstr_t strConnect="Provider=SQLOLEDB; Server=server_name;"
"Database=database_name; uid=user_name; pwd=password;"; 
//connecting to the database server now:
try{pMyConnect->Open(strConnect,"","",NULL);}
*/
BOOL CAdoAcc::ConnectSqlserver(CString Server,CString db,CString User,CString Password)
{
CString s;
s.Format("Provider=SQLOLEDB;Data Source=%s;Database=%s",Server,db);
     try{ 
         m_pConnection.CreateInstance(__uuidof(Connection));
         HRESULT hr;


          //自己配置连接字符串
             m_pConnection->ConnectionString = _bstr_t(s);
             hr=m_pConnection->Open("",_bstr_t(User),_bstr_t(Password),-1);  


         //进行连接
         //连接失败
         if(FAILED(hr))
         {                
             AfxMessageBox("连接失败!");
             return FALSE;
         }
     }
     catch(_com_error&e)
     {
AfxMessageBox(s);
         AfxMessageBox(e.Description()+"B");
         return FALSE;
     } 
     return TRUE;
}
//conn->Open("Provider=OraOLEDB.Oracle.1;DataSource=yourDB;User ID=yourID;Password=yourPASSWORD","","",adModeUnknown);
BOOL CAdoAcc::ConnectOracle(CString Datasource,CString Userid,CString Password)
{
CString s;
s.Format("Provider=OraOLEDB.Oracle.1;Data Source=%s;User ID=%s;Password=%s",Datasource,Userid,Password);
     try{ 
         m_pConnection.CreateInstance(__uuidof(Connection));
         HRESULT hr;


          //自己配置连接字符串
             //m_pConnection->ConnectionString = _bstr_t(s);


             hr=m_pConnection->Open(_bstr_t(s),"","",adModeUnknown);  


         //进行连接
         //连接失败
         if(FAILED(hr))
         {                
             AfxMessageBox("连接失败!");
             return FALSE;
         }
     }
     catch(_com_error&e)
     {
AfxMessageBox(s);
         AfxMessageBox(e.Description()+"B");
         return FALSE;
     } 
     return TRUE;
}


 //断开连接
 void CAdoAcc::DisConnect()
 {
     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; 
 }
 
 ///////////////////////////////////////////////////////////////////////
 ///更新操作
 ///////////////////////////////////////////////////////////////////////
 BOOL CAdoAcc::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 CAdoAcc::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 CAdoAcc::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 CAdoAcc::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 CAdoAcc::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 CAdoAcc::Open(CString sql)
 {
     if(m_pRecordset->State != adStateClosed)
         m_pRecordset->Close();
     try
     {
         m_nResultCol=0;
         m_nResultRow=0;  
         m_pRecordset->CursorLocation=adUseClient;    //设置游标位置,设置为客户端形式,否则GetRecordCount()返回值不对
         m_pRecordset->Open(_variant_t(sql),_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()+"E");
         return FALSE;
     }
     return TRUE;
 }
 BOOL CAdoAcc::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 CAdoAcc::CloseRecordset()
 {
     if(m_pRecordset->State != adStateClosed)
         m_pRecordset->Close();
 }


 BOOL CAdoAcc::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;
     } 
 }


void CAdoAcc::MoveNext()
{
if(m_pRecordset->GetadoEOF()!=VARIANT_TRUE)
{
m_pRecordset->MoveNext();
}
}


BOOL CAdoAcc::AdoEOF()
{
if(m_pRecordset->GetadoEOF()!=VARIANT_TRUE)
return false;
else
return true;
}


CString CAdoAcc::GetValues(CString columnName)
{
try
{
return (char *)(_bstr_t)m_pRecordset->GetCollect(_variant_t(columnName));
}
catch(_com_error e)
{
throw e;
}
}
CString CAdoAcc::GetValues(int col)
{
try
{
_variant_t vt;
vt.vt=VT_I4;
vt.iVal=col;
return (char *)(_bstr_t)m_pRecordset->Fields->Item[(long)(col)]->Value;;
}
catch(_com_error e)
{
throw e;
}
}
int CAdoAcc::GetInt(CString columnName)
{
try
{
return (short)m_pRecordset->GetCollect(_variant_t(columnName));
}
catch(_com_error e)
{
throw e;
}
}


void CAdoAcc::CloseCommand()
{
 
     if(m_pCommand->State!=adStateClosed)
         m_pCommand->Release();
     m_pCommand = NULL;
 
}