将数据插入 Table-Valued 参数

SQL Server Native Client OLE DB 访问接口支持两个模型供使用者指定表值参数行的数据:推送模型和拉取模型。 演示拉取模型的示例可用;请参阅 SQL Server 数据编程示例

注释

表值参数列必须在所有行中具有非默认值或所有行中的默认值。 在某些行中不能有默认值,但不能有其他值。 因此,在表值参数绑定中,表值参数行集列数据允许的唯一状态值是DBSTATUS_S_ISNULL和DBSTATUS_S_OK。 DBSTATUS_S_DEFAULT将导致失败,绑定状态值将设置为DBSTATUS_E_BADSTATUS。

推送模型(加载内存中的所有 Table-Valued 分析器数据)

推送模型类似于使用参数集(即 ICommand::Execute 中的 DBPARAMS 参数)。 仅当不使用 IRowset 接口的自定义实现的情况下使用表值参数行集对象时,才使用推送模型。 当表值参数行集中的行数较小且预计不会给应用程序施加过多的内存压力时,建议使用推送模型。 这比拉取模型简单,因为它不需要使用者应用程序提供的功能比典型 OLE DB 应用程序中当前通用的功能更多。

在执行命令之前,使用者应向提供程序提供所有表值参数数据。 为了提供数据,使用者为每个表值参数填充表值参数行集对象。 表值参数行集对象公开行集 Insert、Set 和 Delete作,使用者将使用该作来作表值参数数据。 提供程序将在执行时从此表值参数行集对象中提取数据。

向使用者提供表值参数行集对象时,使用者可以将它作为行集对象进行处理。 使用者可以使用 IColumnsInfo::GetColumnInfo 或 IColumnsRowset::GetColumnsRowset 接口方法获取每个列的类型信息(类型、最大长度、精度和小数位数)。 然后,使用者创建一个访问器来指定数据的绑定。 下一步是将数据行插入表值参数行集中。 可以使用 IRowsetChange::InsertRow 来完成此作。 如果必须作数据,还可以对表值参数行集对象使用 IRowsetChange::SetData 或 IRowsetChange::D eleteRows。 对表值参数行集对象进行引用计数,类似于流对象。

如果使用 IColumnsRowset::GetColumnsRowset,则会对生成的列的行集对象上的 IRowset::GetNextRows、IRowset::GetData 和 IRowset::ReleaseRows 方法进行后续调用。

SQL Server Native Client OLE DB 访问接口开始执行命令后,将从此表值参数行集对象中提取表值参数值并将其发送到服务器。

推送模型需要消耗最少的工作,但使用比拉取模型更多的内存,因为所有表值参数数据必须在执行时位于内存中。

拉取模型(从使用者获取 Table-Valued 参数数据)

拉取模型适用于两种方案:

  • 流式传输行。

  • 如果另一个提供程序中的行集用作表值参数值。

在拉取模型中,使用者按需向提供程序提供数据。 如果应用程序有许多数据插入,并且内存中的表值参数行集数据会导致内存过多访问,请使用此方法。 如果使用多个 OLE DB 提供程序,使用者拉取模型使使用者能够将任何行集对象作为表值参数值提供。

若要使用拉取模型,使用者必须提供自己的行集对象的实现。 将拉取模型用于表值参数行集(CLSID_ROWSET_TVP),使用者需要聚合提供程序通过 ITableDefinitionWithConstraints::CreateTableWithConstraints 方法或 IOpenRowset::OpenRowset 方法公开的表值参数行集对象。 使用者对象仅应重写 IRowset 接口实现。 必须重写以下函数:

  • IRowset::GetNextRows

  • IRowset::AddRefRows

  • IRowset::GetData

  • IRowset::ReleaseRows

  • IRowset::RestartPosition

SQL Server Native Client OLE DB 访问接口一次从使用者行集对象读取一行或多行,以支持表值参数中的流式处理行为。 例如,用户可能具有磁盘(不在内存中)上的表值参数行集数据,并可能实现 SQL Server Native Client OLE DB 访问接口需要时从磁盘读取数据的功能。

使用者将使用表值参数行集对象的 IAccessor::CreateAccessor 将数据格式传递给 SQL Server Native Client OLE DB 提供程序。 从使用者缓冲区读取数据时,提供程序会验证所有可写和非默认列是否通过至少一个访问器句柄提供,并使用相应的句柄读取列数据。 为了避免歧义,表值参数行集列和绑定之间应存在一对一对应关系。 对同一列的重复绑定将导致错误。 此外,每个访问器应按顺序具有 DBBindings 的 iOrdinal 成员。 对 IRowset::GetData 的调用数量与每行访问器数一样多,调用顺序将基于 iOrdinal 值从低到高的顺序。

提供程序应实现表值参数行集对象公开的大多数接口。 使用者将实现具有最小接口的行集对象(IRowset)。 由于盲目聚合,其余必需的行集对象接口将由表值参数行集对象实现。

对于任何其他行集对象(如为任何 OLE DB 访问接口获取的行集对象),使用者提供的行集必须实现 OLE DB 规范中指定的所有必需的行集对象接口。

在执行时,SQL Server Native Client OLE DB 访问接口将调用回行集对象,以提取行和读取列数据。

另请参阅

Table-Valued 参数 (OLE DB)
使用 Table-Valued 参数 (OLE DB)