/*########################################################################
Filename: adorecordset.cpp
----------------------------------------------------
Remarks: ...
----------------------------------------------------
Author: 成真
Email: anyou@sina.com
anyou@msn.com
Created: 29/4/2003 8:15
########################################################################*/
#include "stdafx.h"
#include "AdoRecordSet.h"
#include <math.h>
#include <io.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/*########################################################################
------------------------------------------------
CAdoRecordSet class 构造/析构函数
------------------------------------------------
########################################################################*/
CAdoRecordSet::CAdoRecordSet()
{
m_pConnection = NULL;
m_SearchDirection = adSearchForward;
m_pRecordset.CreateInstance("ADODB.Recordset");
#ifdef _DEBUG
if (m_pRecordset == NULL)
{
AfxMessageBox("RecordSet 对象创建失败! 请确认是否初始化了COM环境.");
}
#endif
ASSERT(m_pRecordset != NULL);
}
CAdoRecordSet::CAdoRecordSet(CAdoConnection *pConnection)
{
m_SearchDirection = adSearchForward;
m_pConnection = pConnection;
ASSERT(m_pConnection != NULL);
m_pRecordset.CreateInstance("ADODB.Recordset");
#ifdef _DEBUG
if (m_pRecordset == NULL)
{
AfxMessageBox("RecordSet 对象创建失败! 请确认是否初始化了COM环境.");
}
#endif
ASSERT(m_pRecordset != NULL);
}
CAdoRecordSet::~CAdoRecordSet()
{
Release();
}
/*========================================================================
Params:
- strSQL: SQL语句, 表名, 存储过程调用或持久 Recordset 文件名.
- CursorType: 可选. CursorTypeEnum 值, 确定打开 Recordset 时应该
使用的游标类型. 可为下列常量之一.
[常量] [说明]
-----------------------------------------------
adOpenForwardOnly 打开仅向前类型游标.
adOpenKeyset 打开键集类型游标.
adOpenDynamic 打开动态类型游标.
adOpenStatic 打开静态类型游标.
-----------------------------------------------
- LockType: 可选, 确定打开 Recordset 时应该使用的锁定类型(并发)
的 LockTypeEnum 值, 可为下列常量之一.
[常量] [说明]
-----------------------------------------------
adLockReadOnly 只读 - 不能改变数据.
adLockPessimistic 保守式锁定 - 通常通过在编辑时立即锁定数据源的记录.
adLockOptimistic 开放式锁定 - 只在调用 Update 方法时才锁定记录.
adLockBatchOptimistic 开放式批更新 - 用于批更新模式(与立即更新模式
相对).
-----------------------------------------------
- lOption 可选. 长整型值, 用于指示 strSQL 参数的类型. 可为下
列常量之一.
[常量] [说明]
-------------------------------------------------
adCmdText 指示strSQL为命令文本, 即普通的SQL语句.
adCmdTable 指示ADO生成SQL查询返回以 strSQL 命名的表中的
所有行.
adCmdTableDirect 指示所作的更改在strSQL中命名的表中返回所有行.
adCmdStoredProc 指示strSQL为存储过程.
adCmdUnknown 指示strSQL参数中的命令类型为未知.
adCmdFile 指示应从在strSQL中命名的文件中恢复保留(保存的)
Recordset.
adAsyncExecute 指示应异步执行strSQL.
adAsyncFetch 指示在提取 Initial Fetch Size 属性中指定的初始
数量后, 应该异步提取所有剩余的行. 如果所需的行尚未
提取, 主要的线程将被堵塞直到行重新可用.
adAsyncFetchNonBlocking 指示主要线程在提取期间从未堵塞. 如果所请求
的行尚未提取, 当前行自动移到文件末尾.
==========================================================================*/
BOOL CAdoRecordSet::Open(LPCTSTR strSQL, long lOption, CursorTypeEnum CursorType, LockTypeEnum LockType)
{
ASSERT(m_pConnection != NULL);
ASSERT(m_pRecordset != NULL);
ASSERT(AfxIsValidString(strSQL));
if(strcmp(strSQL, _T("")) != 0)
{
m_strSQL = strSQL;
}
if (m_pConnection == NULL || m_pRecordset == NULL)
{
return FALSE;
}
if (m_strSQL.IsEmpty())
{
ASSERT(FALSE);
return FALSE;
}
try
{
if (IsOpen()) Close();
return SUCCEEDED(m_pRecordset->Open(_variant_t(LPCTSTR(m_strSQL)),
_variant_t((IDispatch*)m_pConnection->GetConnection(), true),
CursorType, LockType, lOption));
}
catch (_com_error e)
{
TRACE(_T("Warning: 打开记录集发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
TRACE(_T("%s\r\n"), GetLastError());
return FALSE;
}
}
/*========================================================================
Name: 通过重新执行对象所基于的查询, 更新 Recordset 对象中的数据.
----------------------------------------------------------
Params: Options 可选. 指示影响该操作选项的位屏蔽. 如果该参数设置
为 adAsyncExecute, 则该操作将异步执行并在它结束时产生
RecordsetChangeComplete 事件
----------------------------------------------------------
Remarks: 通过重新发出原始命令并再次检索数据, 可使用 Requery 方法刷新
来自数据源的 Recordset 对象的全部内容. 调用该方法等于相继调用 Close 和
Open 方法. 如果正在编辑当前记录或者添加新记录将产生错误.
==========================================================================*/
BOOL CAdoRecordSet::Requery(long Options)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return (m_pRecordset->Requery(Options) == S_OK);
}
}
catch (_com_error e)
{
TRACE(_T("Warning: Requery 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 从基本数据库刷新当前 Recordset 对象中的数据.
----------------------------------------------------------
Params: AffectRecords: 可选, AffectEnum 值, 决定 Resync 方法所影
响的记录数目, 可以为下列常量之一.
[常量] [说明]
------------------------------------
adAffectCurrent 只刷新当前记录.
adAffectGroup 刷新满足当前 Filter 属性设置的记录.只有将 Filter
属性设置为有效预定义常量之一才能使用该选项.
adAffectAll 默认值.刷新 Recordset 对象中的所有记录, 包括由
于当前 Filter 属性设置而隐藏的记录.
adAffectAllChapters 刷新所有子集记录.
ResyncValues: 可选, ResyncEnum 值. 指定是否覆盖基本值. 可为下列
常量之一.
[常量] [说明]
------------------------------------
adResyncAllValues 默认值. 覆盖数据, 取消挂起的更新.
adResyncUnderlyingValues 不覆盖数据, 不取消挂起的更新.
----------------------------------------------------------
Remarks: 使用 Resync 方法将当前 Recordset 中的记录与基本的数据库重新
同步. 这在使用静态或仅向前的游标但希望看到基本数据库中的改动时十分有用.
如果将 CursorLocation 属性设置为 adUseClient, 则 Resync 仅对非只读的
Recordset 对象可用.
与 Requery 方法不同, Resync 方法不重新执行 Recordset 对象的基本的命令,
基本的数据库中的新记录将不可见.
==========================================================================*/
BOOL CAdoRecordSet::Resync(AffectEnum AffectRecords, ResyncEnum ResyncValues)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return (m_pRecordset->Resync(AffectRecords, ResyncValues) == S_OK);
}
}
catch (_com_error e)
{
TRACE(_T("Warning: Resync 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 将 Recordset 保存在持久性文件中.
----------------------------------------------------------
Params:
[strFileName]: 可选. 文件的完整路径名, 用于保存 Recordset.
[PersistFormat]: 可选. PersistFormatEnum 值, 指定保存 Recordset 所使
用的格式. 可以是如下的某个常量:
[常量] [说明]
------------------------------
adPersistADTG 使用专用的"Advanced Data Tablegram"格式保存.
adPersistXML (默认)使用 XML 格式保存.
-------------------------------------------