自己写的一个使用ADO操作ACCESS数据库的例子

转载 http://blog.vckbase.com/hengai/articles/9705.html

自己写的一个使用ADO操作ACCESS数据库的例子,写的很简单,只完成了基本的功能。分为 HADO.h与HADO.cpp文件
---------------------------------------------------------------------------------------------------

//HADO.h

/********************************************************************

 创建日期:  2005/05/19

 创建时间:  16:7:2005   21:57

 文件名称:        HADO.h

     :  hengai

      

 文件说明

            这个类是专门用于 Collector 操作 ADO 的类。

            注意:用到别的使用 ADO 的地方可能不太适合,那时候需要重新写过

*********************************************************************/

 

#ifndef    __HENGAI_CLASS_HADO_H__

#define __HENGAI_CLASS_HADO_H__

 

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

 

class HADO 

{

       typedef   enum{

              BH_NULL = 0,

              BH_SELECT,                    //执行了 SELECT SQL 语句的时候

              BH_INSERTINTO,                  //INSERT INTO

              BH_ADDNEW,                        //pRecordSet->AddNew()

              BH_UPDATESET,                   //UPDATE SET

              BH_PUTCOLLECT,                //pRecordSet-PutCollect(...)

              BH_DELETE,                           //DELETE FROM

       } ESQLState;

public:

       BOOL GetTableNames(CStringArray *psTableName);

       BOOL AdoEof();

       BOOL AdoBof();

       BOOL HasRecord() const;

       BOOL Update();

       BOOL Update ( const _variant_t & Fieldsconst _variant_t & Values );

       BOOL SetFieldValue(const _variant_t &variantconst BYTEpByBinaryDWORD dwFieldLength);

       BOOL SetFieldValue(const _variant_t &variantLONG nFieldValue);

       BOOL SetFieldValue(const _variant_tvariantLPCTSTR pszFileValue);

       BOOL AttachConnection(_ConnectionPtr::Interface *pInterface);

       BOOL GetFieldValue(const _variant_tvariantBYTE **ppbyBinaryDWORD *pFieldLength);

       BOOL GetFieldValue(const _variant_tvariantLONGpnFieldValue);

       BOOL GetFieldValue(const _variant_tvariantCStringpstrFileValue);

       BOOL ExcuteSQLDelect(LPCTSTR pszSQL);

       BOOL ExcuteSQLPutCollect(LPCTSTR pszSQL);

       BOOL ExcuteSQLUpdateSet(LPCTSTR pszSQL);

       BOOL ExcuteSQLAddNew();

       BOOL ExcuteSQLInsertInto(LPCTSTR pszSQL);

       BOOL ExcuteSQLSelect(LPCTSTR pszSQL);

       BOOL GetRecordCount(int *pRecordCount);

       BOOL GetFilesInfo(CStringArray *pFilesArrayint *pnFilesCount);

       //&&&&&&&&&&&&&&&&&&& 下面的几个函数是用来移动记录集的 &&&&&&&&&&&&&&&&&&&

       BOOL Move(int nNumRecords);

       BOOL MoveLast();

       BOOL MoveNext();

       BOOL MovePrevious();

       BOOL MoveFirst();

       //&&&&&&&&&&&&&&&&&&& 上面面的几个函数是用来移动记录集的 &&&&&&&&&&&&&&&&&&&

       BOOL CloseConnection();

       BOOL InitConnection(_bstr_t ConnectionString_bstr_t UserID_bstr_t Passwordlong Options=adModeUnknown);

       HADO();

       virtual ~HADO();

private:

       BOOL GetFieldValue(const _variant_tvariant);

       BOOL ExcuteSQL(LPCTSTR pszSQL);

       void CloseRecordset();

       int m_nRecordCount;

       ESQLState m_ess;

       //定义连接指针

       _ConnectionPtr    m_pConnection;

       CString m_strConnectString;                    //连接字符串

       _RecordsetPtr      m_pRecordset;

       _variant_t m_variant;

       CString m_strSQL;                                  //SQL 语句字符串

       BOOL m_bIsOpenDB;                                  //是否已经打开 DB,允许操作

};

 

#endif // !defined(__HENGAI_CLASS_HADO_H__)


---------------------------------------------------------------------------------------------------

//HADO.cpp 文件

/********************************************************************

 创建日期:  2005/05/9

 创建时间:  16:7:2005   21:59

 文件名称:        HADO.cpp

     :  hengai

      

 文件说明:  自己创建的一个使用ADO操作ACCESS数据库的类。这是 cpp 文件

*********************************************************************/

 

#include "stdafx.h"

#include "HADO.h"

 

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

 

//

// Construction/Destruction

//

/************************************************************************

 函数名称: HADO  

 函数功能构造函数

 输入参数:

 输出参数:

 编写者  :

 创建时间:

************************************************************************/

HADO::HADO()

{

       m_pRecordset = NULL;

       m_pConnection = NULL;

       m_bIsOpenDB = FALSE;

       m_nRecordCount = -1;

       m_ess = BH_NULL;

}

/************************************************************************

 函数名称: ~HADO

 函数功能析构函数

 输入参数:

 输出参数:

 编写者  :

 创建时间:

************************************************************************/

HADO::~HADO()

{

       CloseConnection();

}

 

/************************************************************************

 函数名称: InitConnection 

 函数功能初始化一个 ConnectionPtr 连接。不过不推荐使用这个,而是使用Attach

 输入参数:

           _bstr_t ConnectionString: 连接字符串

           _bstr_t UserID

           _bstr_t Password

           long Options

 输出参数:

 编写者  :

 创建时间:

 返回值  : 连接成功返回 TRUE,失败返回 FALSE

     : m_pConnection 不许为 NULL

************************************************************************/

BOOL HADO::InitConnection(_bstr_t ConnectionString_bstr_t UserID,

                                            _bstr_t Passwordlong Options)

{

       ASSERT(m_pConnection == NULL);

       if(!AfxOleInit()) return FALSE;

       m_pConnection.CreateInstance(__uuidof(Connection));

       if(m_pConnection == NULLreturn FALSE;

       try                

       {    

              m_pConnection->Open(ConnectionString,      //ConnectionString

                     UserID,  //UserID

                     Password,     //Password

                     Options);             

       }

       catch(_com_error e)

       {

              return FALSE;

       }

       ASSERT(m_pConnection != NULL);

       HRESULT hr = m_pRecordset.CreateInstance(__uuidof(Recordset));

       if(FAILED(hr) ) {

              //AfxMessageBox(_T("初始化 COM 借口失败!按下确定后程序退出。"));

              return FALSE;

       }

       m_strConnectString = (LPCTSTRConnectionString;

       return TRUE;

}

 

/************************************************************************

 函数名称: AttachConnection 

 函数功能: RecordsetPtr 与一个输入的参数的 ConnectionPtr 绑定

 输入参数: _ConnectionPtr::Interface *pInterface: 一个ConnectionPtr的连接指针

 输出参数:

 编写者  :

 创建时间:

 返回值  : 绑定成功返回TRUE,失败返回FALSE

     :

************************************************************************/

BOOL HADO::AttachConnection(_ConnectionPtr::Interface *pInterface)

{

       ASSERT(m_pConnection == NULL);

       m_pConnection.Attach(pInterface);

       m_strConnectString.Empty();

       ASSERT(m_pConnection != NULL);

       HRESULT hr = m_pRecordset.CreateInstance(__uuidof(Recordset));

       if(FAILED(hr) ) {

              //AfxMessageBox(_T("初始化 COM 借口失败!按下确定后程序退出。"));

              return FALSE;

       }

       return TRUE;

}

 

/************************************************************************

 函数名称: CloseConnection 

 函数功能关闭连接。当要连接(或者绑定)一个新的 ConnectionPtr 时候,需要先关闭

 输入参数:

 输出参数:

 编写者  :

 创建时间:

 返回值  : 成功返回TRUE,失败返回FALSE

     如果成功,会把 RecordsetPtr  ConnectionPtr 置为 NULL

************************************************************************/

BOOL HADO::CloseConnection()

{

       if(NULL != m_pRecordset)

       {

              if(m_pRecordset->State)

              {

                     m_pRecordset->Close();

              }

              m_pRecordset.Release();

              m_pRecordset = NULL;

       }

      

       if(NULL != m_pConnection)

       {

              if(m_strConnectString.IsEmpty()){

                     m_pConnection.Detach();

              } else {

                     if(m_pConnection->State)

                     {

                            m_pConnection->Close();

                     }

                     m_pConnection.Release();

              }

              m_pConnection = NULL;

       }

       return TRUE;

}

 

/************************************************************************

 函数名称: GetFilesInfo 

 函数功能得到字段的信息,包括字段的名称、字段的数目等

 输入参数:

 输出参数: CStringArray *pFilesArray: 返回字段的名称。

              如果!=NULL,则个数与 *pnFieldsCount 相同

              如果==NULL,表明仅仅得到字段的个数,不获取字段名称

           int *pnFieldsCount: 字段的个数。不能为NULL

 编写者  :

 创建时间:

 返回值  : 成功返回TRUE,并且会修改参数。失败返回FALSE

     :

************************************************************************/

BOOL HADO::GetFilesInfo(CStringArray *pFilesArrayint *pnFieldsCount)

{

       if(pFilesArray==NULL && pnFieldsCount==NULLreturn FALSE;

       if(m_ess != BH_SELECT)         //必须执行了查询操作才能够得到字段信息

       {

              return FALSE;

       }

 

       BOOL bRet=FALSE;

       long nFieldsCount=0;

 

       if(NULL != m_pRecordset)

       {

              nFieldsCount = m_pRecordset->GetFields()->Count;

              bRet = TRUE;

              if(pFilesArray) {

                     CString szField;

                     pFilesArray->RemoveAll();

                     for(long i=0i<nFieldsCounti++)

                     {

                            szField.Format(_T("%s"), (m_pRecordset->GetFields()->Item[i]->Name));

                            pFilesArray->Add(szField);

                     }

              }

              if(pnFieldsCount) *pnFieldsCount = nFieldsCount;

       }

       return bRet;

}

 

/************************************************************************

 函数名称: GetTableNames 

 函数功能得到数据库的表名

 输入参数: CStringArray *psTableName: 数据库表明存放到这个 StringArray 

 输出参数:

 编写者  :

 创建时间:

 返回值  : 成功返回TRUE,失败返回FALSE

     这个函数没有完成

************************************************************************/

//

BOOL HADO::GetTableNames(CStringArray *psTableName)

{

       if(!psTableNamereturn FALSE;

       //CloseRecordset();

       //try

       //{

       //     m_pRecordset->

       //}

       //catch(_com_error *e)

       //{

       //     AfxMessageBox(e->ErrorMessage());

       //     return FALSE;

       //}

       return TRUE;

      

}

 

/************************************************************************

 函数名称: CloseRecordset 

 函数功能关闭 Recordset 连接

 输入参数:

 输出参数:

 编写者  :

 创建时间:

 返回值  : 成功返回TRUE,失败返回FALSE

     : __inline 函数

************************************************************************/

__inline void HADO::CloseRecordset()

{

       ASSERT(m_pRecordset != NULL);

       if(m_pRecordset->State)

              m_pRecordset->Close();

}

 

//&&&&&&&&&&&&&&&&&&& 下面的几个函数是用来移动记录集的 &&&&&&&&&&&&&&&&&&&

/************************************************************************

 函数名称: MoveFirst 

 函数功能将记录集移动到最前

 输入参数:

 输出参数:

 编写者  :

 创建时间:

 返回值  : 成功返回TRUE,失败返回FALSE

     :

************************************************************************/

BOOL HADO::MoveFirst()

{

       if(m_ess==BH_DELETE || m_ess==BH_NULL)

       {

              return FALSE;

       }

       ASSERT(m_pRecordset!=NULL);

       BOOL bRet = FALSE;

       HRESULT ret=S_FALSE;

 

       if(NULL != m_pRecordset)

       {

              ret = m_pRecordset->MoveFirst();

       }

 

       if(ret == S_OK)

       {

              bRet = TRUE;

       }

 

       return bRet;

}

/************************************************************************

 函数名称: MovePrevious

 函数功能将记录集指针向前移动一条

 输入参数:

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE,失败返回FALSE

     :

************************************************************************/

BOOL HADO::MovePrevious()

{

       if(m_ess==BH_DELETE || m_ess==BH_NULL)

       {

              return FALSE;

       }

       ASSERT(m_pRecordset!=NULL);

       BOOL bRet = FALSE;

       HRESULT ret=S_FALSE;

 

       if(NULL != m_pRecordset)

       {

              ret = m_pRecordset->MovePrevious();

       }

 

       if(ret == S_OK)

       {

              bRet = TRUE;

       }

 

       return bRet;

}

/************************************************************************

 函数名称: MoveNext

 函数功能将记录集指针向后移动一条

 输入参数:

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE,失败返回 FALSE

     :

************************************************************************/

BOOL HADO::MoveNext()

{

       if(m_ess==BH_DELETE || m_ess==BH_NULL)

       {

              return FALSE;

       }

       ASSERT(m_pRecordset!=NULL);

       BOOL bRet = FALSE;

       HRESULT ret=S_FALSE;

 

       if(NULL != m_pRecordset)

       {

              ret = m_pRecordset->MoveNext();

       }

 

       if(ret == S_OK)

       {

              bRet = TRUE;

       }

 

       return bRet;

}

/************************************************************************

 函数名称: MoveLast

 函数功能将记录集指针移动到最后

 输入参数:

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, 失败返回FALSE

     :

************************************************************************/

BOOL HADO::MoveLast()

{

       if(m_ess==BH_DELETE || m_ess==BH_NULL)

       {

              return FALSE;

       }

       ASSERT(m_pRecordset!=NULL);

       BOOL bRet = FALSE;

       HRESULT ret=S_FALSE;

 

       if(NULL != m_pRecordset)

       {

              ret = m_pRecordset->MoveLast();

       }

       if(ret == S_OK)

       {

              bRet = TRUE;

       }

       return bRet;

}

/************************************************************************

 函数名称: Move

 函数功能移动记录集指针

 输入参数: int nNumRecords: 需要移动的记录条数

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, 失败返回FALSE

     :

************************************************************************/

BOOL HADO::Move(int nNumRecords)

{

       if(m_ess==BH_DELETE || m_ess==BH_NULL)

       {

              return FALSE;

       }

       ASSERT(m_pRecordset!=NULL);

       BOOL bRet = FALSE;

       HRESULT ret=S_FALSE;

 

       if(NULL != m_pRecordset)

       {

              ret = m_pRecordset->Move(nNumRecords);

       }

 

       if(ret == S_OK)

       {

              bRet = TRUE;

       }

       return bRet;

}

//&&&&&&&&&&&&&&&&&&& 上面的几个函数是用来移动记录集的 &&&&&&&&&&&&&&&&&&&

 

/************************************************************************

 函数名称: ExcuteSQL

 函数功能执行一个 SQL 语句

 输入参数: LPCTSTR pszSQL: 需要执行的 SQL 语句的字符串

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, 失败FALSE

     :

************************************************************************/

//执行 SQL 语句。成功返回 TRUE

BOOL HADO::ExcuteSQL(LPCTSTR pszSQL)

{

       CloseRecordset();

       try

       {

              m_pRecordset->Open(pszSQL,

                                                 m_pConnection.GetInterfacePtr(),

                                                 adOpenDynamic,

                                                 adLockOptimistic,

                                                 adCmdText);

       }

       catch(_com_error *e)

       {

              AfxMessageBox(e->ErrorMessage());

              return FALSE;

       }

       return TRUE;

}

 

/************************************************************************

 函数名称: HasRecord

 函数功能判断打开的后是否存在记录

 输入参数:

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 如果存在记录返回TRUE, 没有记录返回FALSE

     :

************************************************************************/

BOOL HADO::HasRecord() const

{

       ASSERT(m_pRecordset->State!=0);

       if(!m_pRecordset->BOF && m_pRecordset->GetRecordCount()) return TRUE;

       return FALSE;

}

 

/************************************************************************

 函数名称: GetRecordCount

 函数功能执行 SQL 后,得到记录集的个数。成功返回TRUE

 输入参数:

 输出参数: int *pRecordCount: 记录集的个数

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, 失败返回FALSE

     这个函数的功能没有完成

************************************************************************/

BOOL HADO::GetRecordCount(int *pRecordCount)

{

       //CloseRecordset();

       return TRUE;

}

 

/************************************************************************

 函数名称: ExcuteSQLSelect

 函数功能执行 SQL 语句 —— 选择操作

 输入参数: LPCTSTR pszSQL: 需要执行选择语句的 SQL 语句

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     :

************************************************************************/

BOOL HADO::ExcuteSQLSelect(LPCTSTR pszSQL)

{

       if(!ExcuteSQL(pszSQL)) return FALSE;

       m_ess = BH_SELECT;

       return TRUE;

}

 

/************************************************************************

 函数名称: ExcuteSQLInsertInto

 函数功能执行 SQL 语句 —— INSERT INTO

 输入参数: LPCTSTR pszSQL: 需要执行插入语句的 SQL 语句

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     :

************************************************************************/

BOOL HADO::ExcuteSQLInsertInto(LPCTSTR pszSQL)

{

       if(!ExcuteSQL(pszSQL)) return FALSE;

       m_ess = BH_SELECT;

       return TRUE;

}

 

/************************************************************************

 函数名称: ExcuteSQLAddNew

 函数功能执行 SQL 语句 —— 使用 pRecordset->AddNew 命令

 输入参数:

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     当用户使用这个函数时,那么表示是需要往数据库里插入记录

************************************************************************/

BOOL HADO::ExcuteSQLAddNew()

{

       if(FAILED(m_pRecordset->AddNew())) return FALSE;

       m_ess = BH_ADDNEW;

       return TRUE;

}

 

/************************************************************************

 函数名称: ExcuteSQLUpdateSet

 函数功能执行 SQL 语句 —— UPDATE table SET ...

 输入参数: LPCTSTR pszSQL: 需要执行Update语句的 SQL 语句

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     :

************************************************************************/

BOOL HADO::ExcuteSQLUpdateSet(LPCTSTR pszSQL)

{

       if(!ExcuteSQL(pszSQL)) return FALSE;

       m_ess = BH_UPDATESET;

       return TRUE;

}

 

/************************************************************************

 函数名称: ExcuteSQLPutCollect

 函数功能执行 SQL 语句 —— 使用 pRecordset->PutCollect 命令。要先使用 SELECT 命令定位到那条记录

 输入参数: LPCTSTR pszSQL: 需要执行PutCollect语句的 SQL 语句

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     :

************************************************************************/

BOOL HADO::ExcuteSQLPutCollect(LPCTSTR pszSQL)

{

       return FALSE;

       CloseRecordset();

       m_ess = BH_PUTCOLLECT;

       return TRUE;

}

 

/************************************************************************

 函数名称: ExcuteSQLDelect

 函数功能执行 SQL 语句 —— DELECT FROM

 输入参数: LPCTSTR pszSQL: 需要执行DELETE FROM语句的 SQL 语句

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     :

************************************************************************/

BOOL HADO::ExcuteSQLDelect(LPCTSTR pszSQL)

{

       if(!ExcuteSQL(pszSQL)) return FALSE;

       m_ess = BH_DELETE;

       return TRUE;

}

 

//

//下面的函数是用来得到字段值(内容)

 

/************************************************************************

 函数名称: GetFieldValue

 函数功能得到字段的内容。使用了一个引用

 输入参数: const _variant_t& variant: 引用,作为一个参数

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     这个函数供类的内部使用。private

************************************************************************/

BOOL HADO::GetFieldValue(const _variant_tvariant)

{

       ASSERT(m_pRecordset != NULL);

       if(m_ess != BH_SELECT)

       {

              return FALSE;

       }

       m_variant = m_pRecordset->Fields->Item[variant]->Value;

       if(m_variant.vt == VT_NULLreturn FALSE;

       return TRUE;

}

 

/************************************************************************

 函数名称: GetFieldValue

 函数功能得到字段的内容

 输入参数: const _variant_t& variant: 引用,作为一个参数

 输出参数: CString *pstrFileValue: 如果该字段内容是 CHAR 类型,那么则保存到这里

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     得到字段类型为CHAR类型的那个字段内容

************************************************************************/

BOOL HADO::GetFieldValue(const _variant_tvariantCString *pstrFileValue)

{

       if(!pstrFileValuereturn FALSE;

       if(!GetFieldValue(variant)) return FALSE;

       if((m_variant.vt != VT_NULL) && (m_variant.vt != VT_EMPTY))

       {

              pstrFileValue->Format(_T("%s"), (LPCTSTR)(_bstr_t)m_variant);

       } else {

              pstrFileValue->Empty();

       }

       return TRUE;

}

 

/************************************************************************

 函数名称: GetFieldValue

 函数功能得到字段的内容

 输入参数: const _variant_t& variant: 引用,作为一个参数

 输出参数: LONG *pnFieldValue: 该字段为 smallint, int, bool, long 的时候

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     字段类型为整数(包括bool, int ,long )的那个字段的内容

************************************************************************/

BOOL HADO::GetFieldValue(const _variant_tvariantLONG *pnFieldValue)

{

       ASSERT(pnFieldValue);

       if(!GetFieldValue(variant)) return FALSE;

       switch(m_variant.vt)

       {

       case VT_BOOL:

              *pnFieldValue = m_variant.boolVal;

              break;

       case VT_I1:

              *pnFieldValue = m_variant.iVal;

              break;

       case VT_INT:

              *pnFieldValue = m_variant.intVal;

              break;

       case VT_I4:

              *pnFieldValue = m_variant.lVal;

              break;

       default:

              return FALSE;

       }

       return TRUE;

       if((m_variant.vt != VT_NULL) && (m_variant.vt != VT_EMPTY))

       {

              //*pnFieldValue = (LONG)(_bstr_t)m_variant;

       }

       return TRUE;

}

 

/************************************************************************

 函数名称: GetFieldValue

 函数功能得到字段的内容

 输入参数: const _variant_t& variant: 引用,作为一个参数

 输出参数: BYTE **ppbyBinary: 一个双重指针,*p 用来保存这个字段的内容(二进制内容)

           DWORD *pFieldLength: 这个字段保存的二进制内容的长度(字节长度)

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     字段类型为OLE(ACCESS数据库)

 

           注意:★★★★★★★★★★★★★★★★★

           这个函数会使用 new 分配一个内容,并不负责回收,需要自己在调用这个函数以后回收

************************************************************************/

BOOL HADO::GetFieldValue(const _variant_tvariantBYTE **ppbyBinaryDWORD *pFieldLength)

{

       ASSERT(pFieldLength);

       *pFieldLength = m_pRecordset->GetFields()->GetItem(variant)->ActualSize;

       if(*pFieldLength>0 && ppbyBinary)

       {

              _variant_t                    varBLOB;

              varBLOB = m_pRecordset->GetFields()->GetItem(variant)->GetChunk(*pFieldLength);

              if(varBLOB.vt == (VT_ARRAY | VT_UI1))

              {

                     if(*ppbyBinary = new BYTE[*pFieldLength+1])                         ///重新分配必要的存储空间

                     {    

                            BYTE *pBuf = NULL;

                            SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);

                            memcpy(*ppbyBinary,pBuf,*pFieldLength);                        ///复制数据到缓冲区m_pBMPBuffer

                            SafeArrayUnaccessData (varBLOB.parray);

                     }

              } else {

                     return FALSE;

              }

       }

       return TRUE;

 

}

 

/************************************************************************

 函数名称: SetFieldValue

 函数功能修改字段值

 输入参数: const _variant_t& variant: 引用,作为一个参数

           LPCTSTR pszFileValue: 这个字段新的内容

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     该字段类型为CHAR

************************************************************************/

BOOL HADO::SetFieldValue(const _variant_t &variantLPCTSTR pszFileValue)

{

       m_pRecordset->PutCollect(variantpszFileValue);

       return TRUE;

}

 

/************************************************************************

 函数名称: SetFieldValue

 函数功能修改字段值

 输入参数: const _variant_t& variant: 引用,作为一个参数

           LONG nFieldValue: 这个字段新的内容

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     该字段类型为 整数相关(包括 bool, int, long )

************************************************************************/

BOOL HADO::SetFieldValue(const _variant_t &variantLONG nFieldValue)

{

       m_pRecordset->PutCollect(variantnFieldValue);

       return TRUE;

}

 

/************************************************************************

 函数名称: SetFieldValue

 函数功能修改 Binary 类型的字段

 输入参数: const _variant_t& variant: 引用,作为一个参数

           pByBinary: 这个字段新的内容(二进制)

           DWORD dwFieldLength: 字段的二进制内容的长度

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     该字段类型为 整数相关(包括 bool, int, long )

************************************************************************/

BOOL HADO::SetFieldValue(const _variant_t &variantconst BYTE *pByBinaryDWORD dwFieldLength)

{

       //写入 binary_object 字段的 长二进制类型的值

       if(pByBinary && dwFieldLength>0){

              VARIANT                  varBLOB;

              SAFEARRAY            *psa;

              SAFEARRAYBOUND     rgsabound[1];

             

              rgsabound[0].lLbound = 0;

              rgsabound[0].cElements = dwFieldLength;

              psa = SafeArrayCreate(VT_UI11rgsabound);

              for (long i = 0i < dwFieldLengthi++)

                     SafeArrayPutElement (psa, &i, (void*)(pByBinary+i));

              varBLOB.vt = VT_ARRAY | VT_UI1;

              varBLOB.parray = psa;

              m_pRecordset->GetFields()->GetItem(variant)->AppendChunk(varBLOB);

       } else {

              //m_pRecordset->GetFields()->GetItem(variant)->AppendChunk(NULL);

       }

       return TRUE;

}

 

/************************************************************************

 函数名称: Update

 函数功能确认数据库的修改操作

 输入参数: const _variant_t &Fields, const _variant_t &Values

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 成功返回TRUE, ?败返回FALSE

     在执行完更新数据库操作后,需要调用这个函数确认更新

************************************************************************/

//执行完 SetFieldsValue 之后,需要调用这个更新数据库

BOOL HADO::Update(const _variant_t &Fieldsconst _variant_t &Values)

{

       if(FAILED(m_pRecordset->Update(FieldsValues))) return FALSE;

       return TRUE;

}

BOOL HADO::Update()

{

       if(FAILED(m_pRecordset->Update())) return FALSE;

       return TRUE;

}

 

/************************************************************************

 函数名称: AdoBof

 函数功能判断记录集指针是否已经移动到了开头

 输入参数:

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 如果记录集指针已经是最开头,那么返回TRUE,如果不是返回FALSE

     :

************************************************************************/

BOOL HADO::AdoBof()

{

       BOOL bRet=TRUE;

       HRESULT ret=1;

 

       if(NULL != m_pRecordset)

       {

              ret = m_pRecordset->BOF;

       }

 

       if(ret == 0)

       {

              bRet = FALSE;

       }

 

       return bRet;

}

 

/************************************************************************

 函数名称: AdoEof

 函数功能判断记录集指针是否已经移动到了末尾

 输入参数:

 输出参数:

 编写者  : hengai

 创建时间:

 返回值  : 如果记录集指针已经是最末尾,那么返回TRUE,如果不是返回FALSE

     :

************************************************************************/

BOOL HADO::AdoEof()

{

       BOOL bRet = TRUE;

       HRESULT ret=1;

 

       if(NULL != m_pRecordset)

       {

              ret = m_pRecordset->adoEOF;

       }

 

       if(ret == 0)

       {

              bRet = FALSE;

       }

 

       return bRet;

}

 

---------------------------------------------------------------------------------------------------

另外,自己写了一个函数,是得到数据库表名的

 

//得到数据库的表名

BOOL CCollectorApp::GetTableNames(CStringArray *psTableNameLPCTSTR pszDBPathName)

{

       if(!psTableName || !pszDBPathNamereturn FALSE;

       _ConnectionPtr pConnection;

       pConnection.CreateInstance(__uuidof(Connection));

       _RecordsetPtr pRecordset;

       try                

       {    

              CString strSql;

              strSql.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"), pszDBPathName);

              pConnection->Open((LPCTSTR)strSql,  //ConnectionString

                     _T(""),    //UserID

                     _T(""),    //Password

                     adModeUnknown);    

              pRecordset = pConnection->OpenSchema(adSchemaTables);

       }

       catch(_com_error e)

       {

              CString strMessage;

              strMessage.Format(_T("打开数据库 %s 失败!\n请确认该数据库文件的正确性"), pszDBPathName);

              AfxMessageBox(strMessage);

              return FALSE;

       }

       ASSERT(pRecordset!=NULL);

       pRecordset->MoveFirst();

       _variant_t variant;

       CString strTableInfo;          //是属于自己的 Table 还是 Access 系统自带的 Table

       CString strTableName;              //表名

       while(!pRecordset->adoEOF){

              variant = pRecordset->GetCollect(long(2));

              ASSERT(variant.vt == VT_BSTR);

              strTableName = (LPCTSTR)(_bstr_t)variant;

              variant = pRecordset->GetCollect(long(3));

              ASSERT(variant.vt == VT_BSTR);

              strTableInfo = (LPCTSTR)(_bstr_t)variant;

              if(strTableInfo.CompareNoCase(_T("TABLE")) == 0){

                     psTableName->Add(strTableName);

                     TRACE(_T("       TABLE: %s ====================\n"), strTableName);

              }

#ifdef _DEBUG

              else if(strTableInfo.CompareNoCase(_T("ACCESS TABLE")) == 0){

                     TRACE(_T("ACCESS TABLE: %s ====================\n"), strTableName);

              }  else if(strTableInfo.CompareNoCase(_T("SYSTEM TABLE")) == 0){

                     TRACE(_T("SYSTEM TABLE: %s ====================\n"), strTableName);

              } else{

                     TRACE(_T("       ERROR: Table Flag is: %s, Table Name is: \n"), strTableInfostrTableName);

              }

#endif

              pRecordset->MoveNext();

       }

       pRecordset.Release();

       pConnection.Release();

       return TRUE;

}

 


//用法

       try

       {

              m_ADO.ExcuteSQLSelect(_T("SELECT * FROM tree_table ORDER BY sequence"));

              if(!m_ADO.AdoBof())

                     m_ADO.MoveFirst();

              else

              {

                     return TRUE;

              }

              LONG lValue = 0;

              while(!m_ADO.AdoEof())

              {

                     STreeItem treeinfo;

 

                     m_ADO.GetFieldValue(_T("name"), &strName);

 

                     m_ADO.GetFieldValue(_T("indent_level"), &lValue);

 

                     m_ADO.GetFieldValue(_T("flag"), &lValue);

 

                     m_ADO.GetFieldValue(_T("parent_flag"), &lValue);

                    

                     m_ADO.GetFieldValue(_T("icon_normal"), &lValue);

                    

                     m_ADO.GetFieldValue(_T("icon_select"), &lValue);

 

                     m_ADO.GetFieldValue(_T("expand"), &lValue);

 

                     m_ADO.MoveNext();

              }

       }

       catch(_com_error *e)

       {

              AfxMessageBox(e->ErrorMessage());

              return FALSE;

       }

       return TRUE;

}

 

//写二进制的字段

       //

       BYTE *byContent = new BYTE[dwFileLength+1];

       file.SeekToBegin();

       file.ReadHuge(byContentdwFileLength);

       file.Close();

 

       m_ADO.ExcuteSQLAddNew();

       m_ADO.SetFieldValue(_T("flag"), long(m_nFlag));

       m_ADO.SetFieldValue(_T("number"), long(m_nNumber));

       //m_ADO.SetFieldValue(_T("description"), _T(""));

       m_ADO.SetFieldValue(_T("file_name"), strFileName);

       m_ADO.SetFieldValue(_T("file_size"), long(dwFileLength));

       m_ADO.SetFieldValue(_T("is_compressed"), long(m_bCompress));

 

       BYTE *byCompress = byContent;

       DWORD nCompressLength = dwFileLength;

       if(m_bCompress){

              m_compress.Release();

              m_compress.Compress(byContentdwFileLengthbyCompress, (int&)nCompressLength);

       }

 

       m_ADO.SetFieldValue(_T("file_content"), byCompressnCompressLength);

       m_ADO.Update();

 

       delete[] byContent;

---------------------------------------------------------------------------------------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值