使用 IMultipleResults 处理多个结果集

使用者使用 IMultipleResults 接口来处理 SQL Server Native Client OLE DB 提供程序命令执行返回的结果。 当 SQL Server Native Client OLE DB 提供程序提交执行命令时,SQL Server 将执行语句并返回任何结果。

客户端必须处理命令执行的所有结果。 由于 SQL Server Native Client OLE DB 提供程序命令执行可以生成多行集对象作为结果,因此请使用 IMultipleResults 接口来确保应用程序数据检索完成客户端发起的往返。

以下 Transact-SQL 语句生成多个行集,一些行集包含 OrderDetails 表中的行数据,以及一些包含 COMPUTE BY 子句的结果:

SELECT OrderID, FullPrice = (UnitPrice * Quantity), Discount,  
    Discounted = UnitPrice * (1 - Discount) * Quantity  
FROM OrderDetails  
ORDER BY OrderID  
COMPUTE  
    SUM(UnitPrice * Quantity), SUM(UnitPrice * (1 - Discount) * Quantity)  
    BY OrderID  

如果使用者执行包含此文本的命令,并请求行集作为返回的结果接口,则仅返回第一组行。 使用者可以处理返回的行集中的所有行。 但是,如果DBPROP_MULTIPLECONNECTIONS数据源属性设置为VARIANT_FALSE,并且未在连接上启用 MARS,则在取消命令之前,无法对会话对象(SQL Server Native Client OLE DB 访问接口创建另一个连接)执行其他命令。 如果未在连接上启用 MARS,则 SQL Server Native Client OLE DB 访问接口在VARIANT_FALSE DBPROP_MULTIPLECONNECTIONS时返回DB_E_OBJECTOPEN错误,如果存在活动事务,则返回E_FAIL。

使用流式输出参数时,SQL Server Native Client OLE DB 访问接口也将返回DB_E_OBJECTOPEN,并且应用程序在调用 IMultipleResults::GetResults 之前未使用所有返回的输出参数值来获取下一个结果集。 如果未启用 MARS 并且连接正忙于运行不生成行集或生成不是服务器游标的行集的命令,并且如果DBPROP_MULTIPLECONNECTIONS数据源属性设置为VARIANT_TRUE,则 SQL Server Native Client OLE DB 访问接口会创建其他连接以支持并发命令对象, 除非事务处于活动状态,否则它将返回错误。 事务和锁定由 SQL Server 按连接进行管理。 如果生成第二个连接,则单独的连接上的命令不会共享锁。 必须小心,以确保一个命令不会阻止另一个命令,方法是对另一个命令请求的行持有锁。 如果启用了 MARS,则多个命令可以在连接上处于活动状态,并且正在使用显式事务时,命令都共享一个通用事务。

使用者可以使用 ISSAbort::Abort 或释放命令对象和派生行集上保留的所有引用来取消命令。

在所有实例中使用 IMultipleResults 可让使用者获取由命令执行生成的所有行集,并允许使用者适当地确定何时取消命令执行并释放会话对象以供其他命令使用。

注释

使用 SQL Server 游标时,命令执行将创建游标。 SQL Server 在创建游标时返回成功或失败;因此,从命令执行返回后,将完成对 SQL Server 实例的往返。 然后,每个 GetNextRows 调用都会成为往返。 这样,就可以存在多个活动命令对象,每个对象都处理一个行集,这是从服务器游标提取的结果。 有关详细信息,请参阅 行集和 SQL Server 游标

另请参阅

命令