转载 http://blog.vckbase.com/hengai/articles/9705.html
---------------------------------------------------------------------------------------------------
//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 & Fields, const _variant_t & Values );
BOOL SetFieldValue(const _variant_t &variant, const BYTE* pByBinary, DWORD dwFieldLength);
BOOL SetFieldValue(const _variant_t &variant, LONG nFieldValue);
BOOL SetFieldValue(const _variant_t& variant, LPCTSTR pszFileValue);
BOOL AttachConnection(_ConnectionPtr::Interface *pInterface);
BOOL GetFieldValue(const _variant_t& variant, BYTE **ppbyBinary, DWORD *pFieldLength);
BOOL GetFieldValue(const _variant_t& variant, LONG* pnFieldValue);
BOOL GetFieldValue(const _variant_t& variant, CString* pstrFileValue);
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 *pFilesArray, int *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 Password, long Options=adModeUnknown);
HADO();
virtual ~HADO();
private:
BOOL GetFieldValue(const _variant_t& variant);
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 Password, long Options)
{
ASSERT(m_pConnection == NULL);
if(!AfxOleInit()) return FALSE;
m_pConnection.CreateInstance(__uuidof(Connection));
if(m_pConnection == NULL) return 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 = (LPCTSTR) ConnectionString;
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 *pFilesArray, int *pnFieldsCount)
{
if(pFilesArray==NULL && pnFieldsCount==NULL) return 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=0; i<nFieldsCount; i++)
{
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(!psTableName) return 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_t& variant)
{
ASSERT(m_pRecordset != NULL);
if(m_ess != BH_SELECT)
{
return FALSE;
}
m_variant = m_pRecordset->Fields->Item[variant]->Value;
if(m_variant.vt == VT_NULL) return FALSE;
return TRUE;
}
/************************************************************************
函数名称: GetFieldValue
函数功能: 得到字段的内容
输入参数: const _variant_t& variant: 引用,作为一个参数
输出参数: CString *pstrFileValue: 如果该字段内容是 CHAR 类型,那么则保存到这里
编写者 : hengai
创建时间:
返回值 : 成功返回TRUE, ?败返回FALSE
备 注: 得到字段类型为CHAR类型的那个字段内容
************************************************************************/
BOOL HADO::GetFieldValue(const _variant_t& variant, CString *pstrFileValue)
{
if(!pstrFileValue) return 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_t& variant, LONG *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_t& variant, BYTE **ppbyBinary, DWORD *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 &variant, LPCTSTR pszFileValue)
{
m_pRecordset->PutCollect(variant, pszFileValue);
return TRUE;
}
/************************************************************************
函数名称: SetFieldValue
函数功能: 修改字段值
输入参数: const _variant_t& variant: 引用,作为一个参数
LONG nFieldValue: 这个字段新的内容
输出参数:
编写者 : hengai
创建时间:
返回值 : 成功返回TRUE, ?败返回FALSE
备 注: 该字段类型为 整数相关(包括 bool, int, long 等)
************************************************************************/
BOOL HADO::SetFieldValue(const _variant_t &variant, LONG nFieldValue)
{
m_pRecordset->PutCollect(variant, nFieldValue);
return TRUE;
}
/************************************************************************
函数名称: SetFieldValue
函数功能: 修改 Binary 类型的字段
输入参数: const _variant_t& variant: 引用,作为一个参数
pByBinary: 这个字段新的内容(二进制)
DWORD dwFieldLength: 字段的二进制内容的长度
输出参数:
编写者 : hengai
创建时间:
返回值 : 成功返回TRUE, ?败返回FALSE
备 注: 该字段类型为 整数相关(包括 bool, int, long 等)
************************************************************************/
BOOL HADO::SetFieldValue(const _variant_t &variant, const BYTE *pByBinary, DWORD 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_UI1, 1, rgsabound);
for (long i = 0; i < dwFieldLength; i++)
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 &Fields, const _variant_t &Values)
{
if(FAILED(m_pRecordset->Update(Fields, Values))) 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 *psTableName, LPCTSTR pszDBPathName)
{
if(!psTableName || !pszDBPathName) return 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"), strTableInfo, strTableName);
}
#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(byContent, dwFileLength);
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(byContent, dwFileLength, byCompress, (int&)nCompressLength);
}
m_ADO.SetFieldValue(_T("file_content"), byCompress, nCompressLength);
m_ADO.Update();
delete[] byContent;
---------------------------------------------------------------------------------------