适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Analytics Platform System (PDW)
使用者使用 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 游标。