IMAPITable::QueryRows

适用于:Outlook 2013 | Outlook 2016

从表中返回一行或多行,从当前游标位置开始。

HRESULT QueryRows(
LONG lRowCount,
ULONG ulFlags,
LPSRowSet FAR * lppRows
);

参数

lRowCount

[in]要返回的最大行数。

ulFlags

[in]控制如何返回行的标志的位掩码。 可以设置以下标志:

TBL_NOADVANCE

防止游标由于行检索而前进。 如果设置了TBL_NOADVANCE标志,游标将指向返回的第一行。 如果未设置TBL_NOADVANCE标志,则游标指向返回的最后一行之后的行。

lppRows

[out]指向包含表行 的 SRowSet 结构的指针的指针。

返回值

S_OK

已成功返回行。

MAPI_E_BUSY

另一个操作正在进行中,该操作阻止行检索操作启动。 应允许正在进行的操作完成,或者应停止该操作。

MAPI_E_INVALID_PARAMETER

IRowCount 参数设置为零。

备注

IMAPITable::QueryRows 方法从表中获取一行或多行数据。 IRowCount 参数的值会影响检索的起点。 如果 IRowCount 为正数,则从当前位置开始向前读取行。 如果 IRowCount 为负数, QueryRows 通过向后移动指示的行数来重置起点。 重置游标后,将按向前顺序读取行。

lppRows 参数指向的 SRowSet 结构中的 cRows 成员指示返回的行数。 如果返回零行:

  • 游标已定位在表的开头, 并且 IRowCount 的值为负。 -或-

  • 游标已定位在表的末尾, 并且 IRowCount 的值为正。

每行的列数及其排序相同。 如果行不存在属性或读取属性时出错,则该行中该属性的 SPropValue 结构包含以下值:

  • ulPropTag 成员中属性类型的PT_ERROR。

  • Value 成员的MAPI_E_NOT_FOUND。

对于 lppRows 参数指向的行集中 SPropValue 结构的内存,必须为每个行单独分配和释放。 使用 MAPIFreeBuffer 释放属性值结构和释放行集。 但是,当对 QueryRows 的 调用返回零(指示表的开头或末尾)时,只需要释放 SRowSet 结构本身。 有关如何在 SRowSet 结构中分配和释放内存的详细信息,请参阅 管理 ADRLIST 和 SRowSet 结构的内存

返回的行及其返回顺序取决于是否已成功调用 IMAPITable::RestrictIMAPITable::SortTable限制 视图中的筛选器行,导致 QueryRows 仅返回与限制中指定的条件匹配的行。 SortTable 建立标准排序顺序或分类排序顺序,从而影响 QueryRows 返回的行序列。 返回的行按传递到 SortTableSSortOrderSet 结构中指定的顺序排列。

每行返回的列及其返回顺序取决于是否已成功调用 IMAPITable::SetColumnsSetColumns 建立一个列集,指定要包含在表中的列中的属性以及它们应包含的顺序。 如果已进行 SetColumns 调用,则每行中的特定列和这些列的顺序与调用中指定的列集匹配。 如果未进行 SetColumns 调用,则表将返回其默认列集。

如果这些调用均未进行, QueryRows 将返回表中的所有行。 每行包含按默认顺序设置的默认列。

在对 IMAPITable::SetColumns 的调用中建立的列集包含设置为 PR_NULL 的列时,lppRows 中返回的行集中的 SPropValue 数组将包含空槽。

针对实现者的说明

可以允许调用方请求列集中包含不受支持的列。 发生这种情况时,请将PT_ERROR放在属性标记的属性类型部分,并在不受支持的列的属性值中MAPI_E_NOT_FOUND。

将行计数视为请求而不是要求。 如果查询方向上没有行,则可以在任意位置返回从零行到请求的数目。

仅返回从分类表视图请求行时用户将看到的行,使调用方能够对数据范围做出有效的假设,并避免额外的工作。

给调用方的说明

通常,最终会得到与 lRowCount 参数中指定的行数一样多的行。 但是,当内存或实现限制是一个问题,或者当操作过早到达表的开头或末尾时, QueryRows 将返回的行数将少于请求的行数。

如果 QueryRows 返回MAPI_E_BUSY,请调用 IMAPITable::WaitForCompletion 方法,并在异步操作完成时重试对 QueryRows 的 调用。

调用 QueryRows 时,请注意,异步通知的计时可能会导致从 QueryRows 返回的行集无法准确表示基础数据。 例如,在删除邮件后但在收到相应通知之前,对文件夹的内容表调用 QueryRows 将导致在行集中返回已删除的行。 在更新用户的数据视图之前,请始终等待通知到达。

有关从表检索行的详细信息,请参阅 从表行检索数据

MFCMAPI 引用

有关 MFCMAPI 示例代码,请参阅下表。

文件 函数 Comment
ContentsTableListCtrl.cpp
DwThreadFuncLoadTable
MFCMAPI 使用 IMAPITable::QueryRows 方法检索表中要加载到视图中的行。

另请参阅

ADRENTRY

FreeProws

HrQueryAllRows

IMAPIProp::GetProps

IMAPITable::SetColumns

IMAPITable::WaitForCompletion

MAPIFreeBuffer

SRow

SRowSet

IMAPITable : IUnknown

MFCMAPI 代码示例