IRowset 接口是基本行集接口。 IRowset 接口提供用于按顺序提取行、从这些行获取数据以及管理行的方法。 使用者将 IRowset 中的方法用于所有基本行集作。 这包括提取和释放行以及获取列值。
当使用者获取行集上的接口指针时,第一步通常是使用 IRowsetInfo::GetProperties 方法确定行集的功能。 这会返回有关行集公开的接口的信息,以及不显示为非重复接口的行集的功能,例如活动行的最大数目和可以同时具有挂起更新的行数。
使用者的下一步是确定行集中列的特征或元数据。 为此,它们使用 IColumnsInfo 方法获取简单列信息,或使用 IColumnsRowset 方法获取扩展列信息。 GetColumnInfo 方法返回以下信息:
结果集中的列数。
DBCOLUMNINFO 结构的数组,每列一个。
结构的顺序是列出现在行集中的顺序。 每个 DBCOLUMNINFO 结构都包含列元数据,例如列名、列序号、列中值的最大可能长度、列的数据类型、精度和长度。
指向单个分配块中所有字符串值的存储的指针。
使用者从元数据或基于生成行集的文本命令确定它需要哪些列。 它从 IColumnsInfo 返回的列信息的顺序或 IColumnsRowset 返回的列元数据行集中的序号中确定所需列的序号。
IColumnsInfo 和 IColumnsRowset 接口用于提取有关行集中列的信息。 IColumnsInfo 接口返回一组有限的信息,而 IColumnsRowset 提供所有元数据。
注释
在 SQL Server 版本 7.0 及更早版本中, IColumnsInfo::GetColumnsInfo 返回的可选元数据列DBCOLUMN_COMPUTEMODE返回DBSTATUS_S_ISNULL(而不是描述是否计算列的值),因为它无法确定基础列是否计算。
序号用于指定对列的绑定。 绑定是将使用者结构元素与列关联的结构。 绑定可以绑定列的数据值、长度和状态值。
一组绑定聚集在访问器中。 这是使用 IAccessor::CreateAccessor 方法创建的 。 访问器可以包含多个绑定,以便可以在单个调用中检索或设置多个列的数据。 使用者可以创建多个访问器来匹配应用程序的不同部分的不同使用模式。 当行集仍然存在时,它可以创建和释放访问器。
若要从数据库提取行,使用者调用方法,例如 IRowset::GetNextRows 或 IRowsetLocate::GetRowsAt。 这些提取作将服务器中的行数据放入提供程序的行缓冲区中。 使用者无权直接访问提供程序的行缓冲区。 使用者使用 IRowset::GetData 将数据从提供程序的缓冲区复制到使用者缓冲区, 使用 IRowsetChange::SetData 将数据从使用者缓冲区复制到提供程序缓冲区。
使用者调用 GetData 方法,并将句柄传递给行、访问器的句柄以及指向使用者分配的缓冲区的指针。 GetData 转换数据,并返回用于创建访问器的绑定中指定的列。 使用者可以使用不同的访问器和缓冲区多次调用 GetData ,因此使用者可以获取相同数据的多个副本。
可以通过多种方式处理来自可变长度列的数据。 首先,此类列可以绑定到使用者结构的有限部分。 当数据的长度超过缓冲区的长度时,这会导致截断。 使用者可以通过检查状态DBSTATUS_S_TRUNCATED来确定截断已发生。 返回的长度始终为真实长度(以字节为单位),以便使用者还可以确定截断的数据量。
当使用者完成提取或更新行后,它会使用 ReleaseRows 方法释放它们。 这会从行集中的行副本释放资源,并为新行腾出空间。 然后,使用者可以重复其循环来提取或创建行并访问其中的数据。
当使用者完成行集后,它将调用 IAccessor::ReleaseAccessor 方法以释放任何访问器。 它在行集公开的所有接口上调用 IUnknown::Release 方法以释放行集。 释放行集时,它会强制释放使用者可能保留的任何剩余行或访问器。