📄 ado.cpp
字号:
}
catch (_com_error e)
{
TRACE(_T(":( MovePrevious发生异常: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE;
}
BOOL CAdoRecordSet::MoveNext()
{
ASSERT(m_pRecordset != NULL);
try
{
if (m_pRecordset != NULL)
{
return SUCCEEDED(m_pRecordset->MoveNext());
}
}
catch (_com_error e)
{
TRACE(_T(":( MoveNext发生异常: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 移动 Recordset 对象中当前记录的位置。
----------------------------------------------------------
Params:
- lRecords 带符号长整型表达式,指定当前记录位置移动的记录数。
- Start 可选,字符串或变体型,用于计算书签。也可为下列 BookmarkEnum 值之一:
常量 说明
adBookmarkCurrent 默认。从当前记录开始。
adBookmarkFirst 从首记录开始。
AdBookmarkLast 从尾记录开始。
==========================================================================*/
BOOL CAdoRecordSet::Move(long lRecords, long 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(":( Move发生异常: %s\n"), e.ErrorMessage());
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);
long lState = 0;
try
{
if (SUCCEEDED(m_pRecordset->get_State(&lState)))
{
return lState;
}
}
catch (_com_error e)
{
TRACE(_T(":( GetState发生异常: %s\n"), e.ErrorMessage());
return NULL;
}
return NULL;
}
/*========================================================================
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);
long lStatus = 0;
try
{
if (SUCCEEDED(m_pRecordset->get_Status(&lStatus)))
{
return lStatus;
}
}
catch (_com_error e)
{
TRACE(_T(":( GetStatus发生异常: %s\n"), e.ErrorMessage());
return NULL;
}
return NULL;
}
/*========================================================================
Name: 获取当前记录集中记录数目
==========================================================================*/
long CAdoRecordSet::GetRecordCount()
{
ASSERT(m_pRecordset != NULL);
long lcount;
try
{
m_pRecordset->get_RecordCount(&lcount);
return lcount;
}
catch(_com_error e)
{
TRACE(_T(":( GetRecordCount发生异常: %s\n"), e.ErrorMessage());
return NULL;
}
}
/*========================================================================
Name: 获取当前记录集中字段数目
==========================================================================*/
long CAdoRecordSet::GetFieldsCount()
{
ASSERT(m_pRecordset != NULL);
try
{
return GetFields()->Count;
}
catch(_com_error e)
{
TRACE(_T(":( GetFieldsCount发生异常: %s\n"), e.ErrorMessage());
return -1;
}
}
/*========================================================================
Name: 指针是否在在记录集头
==========================================================================*/
BOOL CAdoRecordSet::IsBOF()
{
ASSERT(m_pRecordset != NULL);
try
{
return m_pRecordset->adoBOF;
}
catch(_com_error e)
{
TRACE(_T(":( IsBOF发生异常: %s\n"), e.ErrorMessage());
return FALSE;
}
return FALSE;
}
/*========================================================================
Name: 指针是否在在记录集尾
==========================================================================*/
BOOL CAdoRecordSet::IsEOF()
{
ASSERT(m_pRecordset != NULL);
try
{
return m_pRecordset->adoEOF;
}
catch (_com_error e)
{
TRACE(_T(":( IsEOF发生异常: %s\n"), e.ErrorMessage());
return FALSE;
}
}
void CAdoRecordSet::SetAdoConnection(CAdoConnection *pConnection)
{
m_pConnection = pConnection;
}
/*===================================================================
Remarks: Recordset 对象包括 Field 对象组成的 Fields 集合.每个
Field 对象对应 Recordset 集中的一列.
=====================================================================*/
Fields* CAdoRecordSet::GetFields()
{
ASSERT(m_pRecordset != NULL);
FieldsPtr pFields;
try
{
if (SUCCEEDED(m_pRecordset->get_Fields(&pFields)))
{
return pFields;
}
}
catch (_com_error e)
{
TRACE(_T(":( GetFields发生异常: %s\n"), e.ErrorMessage());
return NULL;
}
return NULL;
}
/*========================================================================
Remarks: 取得指定列字段的字段名.
==========================================================================*/
CString CAdoRecordSet::GetFieldName(long lIndex)
{
ASSERT(m_pRecordset != NULL);
CString strFieldName;
try
{
FieldPtr field = GetFields()->GetItem(_variant_t(lIndex));
strFieldName = LPCTSTR(_bstr_t(field->GetName()));
return strFieldName;
field->GetType();
}
catch (_com_error e)
{
TRACE(_T(":( GetFieldName发生异常: %s\n"), e.ErrorMessage());
return strFieldName;
}
}
/*========================================================================
returns: 对于 Field 对象,Attributes 属性为只读,其值可能为以下任意一个或多个 FieldAttributeEnum 值的和。
常量 说明
adFldMayDefer 指示字段被延迟,即不从拥有整个记录的数据源检索
字段值,仅在显式访问这些字段时才进行检索。
adFldUpdatable 指示可以写入该字段。
adFldUnknownUpdatable 指示提供者无法确定是否可以写入该字段。
adFldFixed 指示该字段包含定长数据。
adFldIsNullable 指示该字段接受 Null 值。
adFldMayBeNull 指示可以从该字段读取 Null 值。
adFldLong 指示该字段为长二进制字段。并指示可以使用 AppendChunk 和 GetChunk 方法。
adFldRowID 指示字段包含持久的行标识符,该标识符无法被写入
并且除了对行进行标识(如记录号、唯一标识符等)外不
存在有意义的值。
adFldRowVersion 指示该字段包含用来跟踪更新的某种时间或日期标记。
adFldCacheDeferred 指示提供者缓存了字段值,并已完成随后对缓存的读取。
----------------------------------------------------------
Remarks: 取得 Field 对象一项或多项属性。
==========================================================================*/
long CAdoRecordSet::GetFieldAttributes(long lIndex)
{
ASSERT(m_pRecordset != NULL);
long lAttributes;
try
{
FieldPtr field = GetFields()->GetItem(_variant_t(lIndex));
field->get_Attributes(&lAttributes);
return lAttributes;
}
catch (_com_error e)
{
TRACE(_T(":( GetFieldAttributes发生异常: %s\n"), e.ErrorMessage());
return -1;
}
}
/*========================================================================
Name: 指示 Field 对象所定义的长度。
----------------------------------------------------------
returns: 返回某个字段定义的长度(按字节数)的长整型值。
----------------------------------------------------------
Remarks: 使用 DefinedSize 属性可确定 Field 对象的数据容量。
==========================================================================*/
long CAdoRecordSet::GetFieldDefineSize(long lIndex)
{
ASSERT(m_pRecordset != NULL);
try
{
FieldPtr field = GetFields()->GetItem(_variant_t(lIndex));
return field->GetDefinedSize();
}
catch (_com_error e)
{
TRACE(_T(":( GetDefineSize发生异常: %s\n"), e.ErrorMessage());
return -1;
}
}
/*========================================================================
Name: 取得字段的值的实际长度。
----------------------------------------------------------
returns: 返回长整型值。某些提供者允许设置该属性以便为 BLOB 数据预留
空间,在此情况下默认值为 0。
----------------------------------------------------------
Remarks: 使用 ActualSize 属性可返回 Field 对象值的实际长度.对于所有
字段,ActualSize 属性为只读。如果 ADO 无法确定 Field 对象值的实
际长度,ActualSize 属性将返回 adUnknown。
如以下范例所示,ActualSize 和 DefinedSize 属性有所不同:
adVarChar 声明类型且最大长度为 50 个字符的 Field 对象将返回为
50 的 DefinedSize 属性值,但是返回的 ActualSize 属性值是当前记
录的字段中存储的数据的长度。
==========================================================================*/
long CAdoRecordSet::GetFieldActualSize(long lIndex)
{
ASSERT(m_pRecordset != NULL);
try
{
FieldPtr field = GetFields()->GetItem(_variant_t(lIndex));
return field->GetActualSize();
}
catch (_com_error e)
{
TRACE(_T(":( GetFieldActualSize发生异常: %s\n"), e.ErrorMessage());
return -1;
}
}
/*========================================================================
returns: 返回下列值之一。相应的 OLE DB 类型标识符在下表的说明栏的括号中给出。
常量 说明
---------------------------------------------------------
adArray 与其他类型一起加入逻辑 OR 以指示该数据是那种类型的
安全数组 (DBTYPE_ARRAY)。
adBigInt 8 字节带符号的整数 (DBTYPE_I8)。
adBinary 二进制值 (DBTYPE_BYTES)。
adBoolean 布尔型值 (DBTYPE_BOOL)。
adByRef 与其他类型一起加入逻辑 OR 以指示该数据是其他类型数
据的指针 (DBTYPE_BYREF)。
adBSTR 以空结尾的字符串 (Unicode) (DBTYPE_BSTR)。
adChar 字符串值 (DBTYPE_STR)。
adCurrency 货币值 (DBTYPE_CY)。货币数字的小数点位置固定、小数
点右侧有四位数字。该值保存为 8 字节范围为10,000 的带符
号整型值。
adDate 日期值 (DBTYPE_DATE)。日期按双精度型数值来保存,数
字全部表示从 1899 年 12 月 30 开始的日期数。小数部分是
一天当中的片段时间。
adDBDate 日期值 (yyyymmdd) (DBTYPE_DBDATE)。
adDBTime 时间值 (hhmmss) (DBTYPE_DBTIME)。
adDBTimeStamp 时间戳 (yyyymmddhhmmss 加 10 亿分之一的小数)(DBTYPE_DBTIMESTAMP).
adDecimal 具有固定精度和范围的精确数字值 (DBTYPE_DECIMAL)。
adDouble 双精度浮点值 (DBTYPE_R8)。
adEmpty 未指定值 (DBTYPE_EMPTY)。
adError 32 - 位错误代码 (DBTYPE_ERROR)。
adGUID 全局唯一的标识符 (GUID) (DBTYPE_GUID)。
adIDispatch OLE 对象上 Idispatch 接口的指针 (DBTYPE_IDISPATCH)。
adInteger 4 字节的带符号整型 (DBTYPE_I4)。
adIUnknown OLE 对象上 IUnknown 接口的指针 (DBTYPE_IUNKNOWN)。
adLongVarBinary 长二进制值。
adLongVarChar 长字符串值。
adLongVarWChar 以空结尾的长字符串值。
adNumeric 具有固定精度和范围的精确数字值 (DBTYPE_NUMERIC)。
adSingle 单精度浮点值 (DBTYPE_R4)。
adSmallInt 2 字节带符号整型 (DBTYPE_I2)。
adTinyInt 1 字节带符号整型 (DBTYPE_I1)。
adUnsignedBigInt 8 字节不带符号整型 (DBTYPE_UI8)。
adUnsignedInt 4 字节不带符号整型 (DBTYPE_UI4)。
adUnsignedSmallInt 2 字节不带符号整型 (DBTYPE_UI2)。
adUnsignedTinyInt 1 字节不带符号整型 (DBTYPE_UI1)。
adUserDefined 用户定义的变量 (DBTYPE_UDT)。
adVarBinary 二进制值。
adVarChar 字符串值。
adVariant 自动变体型 (DBTYPE_VARIANT)。
adVector 与其他类型一起加入逻辑 OR 中,指示数据是 DBVECTOR
结构(由 OLE DB 定义)。该结构含有元素的计数和其他类型
(DBTYPE_VECTOR) 数据的指针。
adVarWChar 以空结尾的 Unicode 字符串。
adWChar 以空结尾的 Unicode 字符串 (DBTYPE_WSTR)。
----------------------------------------------------------
Remarks: 返回指定列的数据类型。
==========================================================================*/
DWORD CAdoRecordSet::GetFieldType(long lIndex)
{
ASSERT(m_pRecordset != NULL);
try
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -