📄 adorecordset.cpp
字号:
catch (_com_error e)
{
TRACE(_T("Warning: Update 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
}
CancelUpdate();
return FALSE;
}
/*========================================================================
Name: 将所有挂起的批更新写入磁盘.
----------------------------------------------------------
Params: AffectRecords 可选, AffectEnum 值. 决定 UpdateBatch 方法
所影响的记录数目.可以为如下常量之一.
[常量] [说明]
------------------------------------
adAffectCurrent 只写入当前记录的挂起更改.
adAffectGroup 写入满足当前 Filter 属性设置的记录所发生的挂起
更改. 必须将 Filter 属性设置为某个有效的预定义常量才能使用该选项.
adAffectAll (默认值). 写入 Recordset 对象中所有记录的挂起
更改, 包括由于当前 Filter 属性设置而隐藏的任何记录.
adAffectAllChapters 写入所有子集的挂起更改.
----------------------------------------------------------
Remarks: 按批更新模式修改 Recordset 对象时, 使用 UpdateBatch 方法可
将 Recordset 对象中的所有更改传递到基本数据库.
如果 Recordset 对象支持批更新, 那么可以将一个或多个记录的多重更改缓存在
本地, 然后再调用 UpdateBatch 方法. 如果在调用 UpdateBatch 方法时正在编
辑当前记录或者添加新的记录, 那么在将批更新传送到提供者之前, ADO 将自动
调用 Update 方法保存对当前记录的所有挂起更改.
只能对键集或静态游标使用批更新.
==========================================================================*/
BOOL CAdoRecordSet::UpdateBatch(AffectEnum AffectRecords)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return (m_pRecordset->UpdateBatch(AffectRecords) == S_OK);
}
}
catch (_com_error e)
{
TRACE(_T("Warning: UpdateBatch 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 取消在调用 Update 方法前对当前记录或新记录所作的任何更改.
-----------------------------------------------------
Remarks: 使用 CancelUpdate 方法可取消对当前记录所作的任何更改或放弃
新添加的记录. 在调用 Update 方法后将无法撤消对当前记录或新记录所做的更
改, 除非更改是可以用 RollbackTrans 方法回卷的事务的一部分, 或者是可以
用 CancelBatch 方法取消的批更新的一部分.
如果在调用 CancelUpdate 方法时添加新记录, 则调用 AddNew 之前的当前
记录将再次成为当前记录.
如果尚未更改当前记录或添加新记录, 调用 CancelUpdate 方法将产生错误.
==========================================================================*/
BOOL CAdoRecordSet::CancelUpdate()
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
if (GetEditMode() == adEditNone || m_pRecordset->CancelUpdate() == S_OK)
{
return TRUE;
}
}
}
catch (_com_error e)
{
TRACE(_T("Warning: CancelUpdate 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 取消挂起的批更新.
-----------------------------------------------------
Params: AffectRecords 可选的 AffectEnum 值, 决定CancelBatch 方法
所影响记录的数目, 可为下列常量之一:
[常量] [说明]
-------------------------------------------------
AdAffectCurrent 仅取消当前记录的挂起更新.
AdAffectGroup 对满足当前 Filter 属性设置的记录取消挂起更新.
使用该选项时,必须将 Filter 属性设置为合法的预
定义常量之一.
AdAffectAll 默认值.取消 Recordset 对象中所有记录的挂起更
新,包括由当前 Filter 属性设置所隐藏的任何记录.
==========================================================================*/
BOOL CAdoRecordSet::CancelBatch(AffectEnum AffectRecords)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return (m_pRecordset->CancelBatch(AffectRecords) == S_OK);
}
}
catch (_com_error e)
{
TRACE(_T("Warning: CancelBatch 发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Params: AffectRecords: AffectEnum 值, 确定 Delete 方法所影响的记
录数目, 该值可以是下列常量之一.
[常量] [说明 ]
-------------------------------------------------
AdAffectCurrent 默认. 仅删除当前记录.
AdAffectGroup 删除满足当前 Filter 属性设置的记录. 要使用该选
项, 必须将 Filter 属性设置为有效的预定义常量之一.
adAffectAll 删除所有记录.
adAffectAllChapters 删除所有子集记录.
==========================================================================*/
BOOL CAdoRecordSet::Delete(AffectEnum AffectRecords)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return (m_pRecordset->Delete(AffectRecords) == S_OK);
}
}
catch (_com_error e)
{
TRACE(_T("Warning: Delete发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*########################################################################
------------------------------------------------
记录集导航操作
------------------------------------------------
########################################################################*/
/*========================================================================
Name: 将当前记录位置移动到 Recordse 中的第一个记录.
==========================================================================*/
BOOL CAdoRecordSet::MoveFirst()
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return SUCCEEDED(m_pRecordset->MoveFirst());
}
}
catch (_com_error e)
{
TRACE(_T("Warning: MoveFirst 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 将当前记录位置移动到 Recordset 中的最后一个记录.
-----------------------------------------------------
Remarks: Recordset 对象必须支持书签或向后光标移动; 否则调用该方法将
产生错误.
==========================================================================*/
BOOL CAdoRecordSet::MoveLast()
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return SUCCEEDED(m_pRecordset->MoveLast());
}
}
catch (_com_error e)
{
TRACE(_T("Warning: MoveLast 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 将当前记录位置向后移动一个记录(向记录集的顶部).
-----------------------------------------------------
Remarks: Recordset 对象必须支持书签或向后游标移动; 否则方法调用将产
生错误.如果首记录是当前记录并且调用 MovePrevious 方法, 则 ADO 将当前记
录设置在 Recordset (BOF为True) 的首记录之前. 而BOF属性为 True 时向后移
动将产生错误. 如果 Recordse 对象不支持书签或向后游标移动, 则 MovePrevious
方法将产生错误.
==========================================================================*/
BOOL CAdoRecordSet::MovePrevious()
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return SUCCEEDED(m_pRecordset->MovePrevious());
}
}
catch (_com_error e)
{
TRACE(_T("Warning: MovePrevious 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 将当前记录向前移动一个记录(向 Recordset 的底部).
-----------------------------------------------------
Remarks: 如果最后一个记录是当前记录并且调用 MoveNext 方法, 则 ADO 将
当前记录设置到 Recordset (EOF为 True)的尾记录之后. 当 EOF 属性已经为
True 时试图向前移动将产生错误.
==========================================================================*/
BOOL CAdoRecordSet::MoveNext()
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return SUCCEEDED(m_pRecordset->MoveNext());
}
}
catch (_com_error e)
{
TRACE(_T("Warning: MoveNext 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 移动 Recordset 对象中当前记录的位置.
----------------------------------------------------------
Params:
- lRecords 带符号长整型表达式, 指定当前记录位置移动的记录数.
- Start 可选, 字符串或变体型, 用于计算书签. 也可为下列
BookmarkEnum 值之一:
[常量] [说明]
--------------------------------
adBookmarkCurrent 默认. 从当前记录开始.
adBookmarkFirst 从首记录开始.
adBookmarkLast 从尾记录开始.
==========================================================================*/
BOOL CAdoRecordSet::Move(long lRecords, _variant_t Start)
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return SUCCEEDED(m_pRecordset->Move(lRecords, _variant_t(Start)));
}
}
catch (_com_error e)
{
TRACE(_T("Warning: Move 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*########################################################################
------------------------------------------------
记录集属性
------------------------------------------------
########################################################################*/
/*========================================================================
Name: 取得记录集对象的状态(是打开状态还是关闭状态). 对异步方式执
行的 Recordset 对象, 则说明当前的对象状态是连接、执行还是获取状态.
-----------------------------------------------------
returns: 返回下列常量之一的长整型值.
[常量] [说明]
----------------------------------
adStateClosed 指示对象是关闭的.
adStateOpen 指示对象是打开的.
adStateConnecting 指示 Recordset 对象正在连接.
adStateExecuting 指示 Recordset 对象正在执行命令.
adStateFetching 指示 Recordset 对象的行正在被读取.
-----------------------------------------------------
Remarks: 可以随时使用 State 属性确定指定对象的当前状态. 该属性是只
读的. Recordset 对象的 State 属性可以是组合值. 例如: 如果正在执行语句,
该属性将是 adStateOpen 和 adStateExecuting 的组合值.
==========================================================================*/
long CAdoRecordSet::GetState()
{
ASSERT(m_pRecordset != NULL);
try
{
return m_pRecordset->GetState();
}
catch (_com_error e)
{
TRACE(_T("Warning: GetState 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return -1;
}
return -1;
}
BOOL CAdoRecordSet::IsOpen()
{
try
{
return (m_pRecordset != NULL && (GetState() & adStateOpen));
}
catch (_com_error e)
{
TRACE(_T("Warning: IsOpen方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 指示有关批更新或其他大量操作的当前记录的状态.
-----------------------------------------------------
returns: 返回下列一个或多个 RecordStatusEnum 值之和.
[常量] [说明]
-------------------------------------------------
adRecOK 成功地更新记录.
adRecNew 记录是新建的.
adRecModified 记录被修改.
adRecDeleted 记录被删除.
adRecUnmodified 记录没有修改.
adRecInvalid 由于书签无效, 记录没有保存.
adRecMultipleChanges 由于影响多个记录, 因此记录未被保存.
adRecPendingChanges 由于记录引用挂起的插入, 因此未被保存.
adRecCanceled 由于操作被取消, 未保存记录.
adRecCantRelease 由于现有记录锁定, 没有保存新记录.
adRecConcurrencyViolation 由于开放式并发在使用中, 记录未被保存.
adRecIntegrityViolation 由于用户违反完整性约束, 记录未被保存.
adRecMaxChangesExceeded 由于存在过多挂起更改, 记录未被保存.
adRecObjectOpen 由于与打开的储存对象冲突, 记录未被保存.
adRecOutOfMemory 由于计算机内存不足, 记录未被保存.
adRecPermissionDenied 由于用户没有足够的权限, 记录未被保存.
adRecSchemaViolation 由于记录违反基本数据库的结构, 因此未被保存.
adRecDBDeleted 记录已经从数据源中删除.
-----------------------------------------------------
Remarks: 使用 Status 属性查看在批更新中被修改的记录有哪些更改被挂起.
也可使用 Status 属性查看大量操作时失败记录的状态. 例如, 调用 Recordset
对象的 Resync、UpdateBatch 或 CancelBatch 方法, 或者设置 Recordset 对象
的 Filter 属性为书签数组. 使用该属性, 可检查指定记录为何失败并将问题解
决.
==========================================================================*/
long CAdoRecordSet::GetStatus()
{
ASSERT(m_pRecordset != NULL);
try
{
return m_pRecordset->GetStatus();
}
catch (_com_error e)
{
TRACE(_T("Warning: GetStatus 方法发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
return -1;
}
return -1;
}
/*========================================================================
Name: 获取当前记录集中记录数目
==========================================================================*/
long CAdoRecordSet::GetRecordCount()
{
ASSERT(m_pRecordset != NULL);
try
{
long count = m_pRecordset->GetRecordCount();
// 如果ado不支持此属性,则手工计算记录数目 --------
if (count < 0)
{
long pos = GetAbsolutePosition();
MoveFirst();
count = 0;
while (!IsEOF())
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -