Utilizar IMultipleResults para procesar varios conjuntos de resultados
Los consumidores utilizan la interfaz IMultipleResults para procesar los resultados devueltos tras la ejecución de comandos del proveedor OLE DB de SQL Server Native Client. Cuando el proveedor OLE DB de SQL Server Native Client envía un comando para su ejecución, SQL Server ejecuta las instrucciones y devuelve resultados.
Un cliente debe procesar todos los resultados de la ejecución de comandos. Dado que la ejecución de comandos del proveedor OLE DB de SQL Server Native Client puede generar objetos con varios conjuntos de filas como resultados, se ha de utilizar la interfaz IMultipleResults para asegurarse de que la recuperación de datos de la aplicación completa el viaje de ida y vuelta (round trip) iniciado en el cliente.
La siguiente instrucción Transact-SQL genera varios conjuntos de filas; unos contienen datos de filas de la tabla OrderDetails y otros contienen resultados de la cláusula 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
Si un consumidor ejecuta un comando que contiene este texto y solicita un conjunto de filas como interfaz de resultados devueltos, solo se devuelve el primer conjunto de filas. El consumidor puede procesar todas las filas del conjunto de filas devuelto. Pero, si la propiedad de origen de datos DBPROP_MULTIPLECONNECTIONS está establecida en VARIANT_FALSE y MARS no está habilitado en la conexión, no se puede ejecutar ningún otro comando en el objeto de sesión (el proveedor OLE DB de SQL Server Native Client no creará otra conexión) hasta que se cancele el comando. Si MARS no está habilitado en la conexión, el proveedor OLE DB de SQL Server Native Client devuelve un error DB_E_OBJECTOPEN si DBPROP_MULTIPLECONNECTIONS es VARIANT_FALSE y devuelve E_FAIL si hay una transacción activa.
El proveedor OLE DB de SQL Server Native Client también devolverá DB_E_OBJECTOPEN si se están utilizando parámetros de salida transmitidos y la aplicación no ha consumido todos los valores de parámetros de salida devueltos antes de llamar a IMultipleResults:: GetResults para obtener el siguiente conjunto de resultados. Si MARS no está habilitado y la conexión está ocupada ejecutando un comando que no genera un conjunto de filas o que genera un conjunto de filas que no es un cursor de servidor, y la propiedad de origen de datos DBPROP_MULTIPLECONNECTIONS está establecida en VARIANT_TRUE, el proveedor OLE DB de SQL Server Native Client crea conexiones adicionales para admitir objetos de comando simultáneos, a menos que haya una transacción activa, en cuyo caso devolverá un error. SQL Server administra las transacciones y el bloqueo para cada conexión. Si se genera una segunda conexión, los comandos de cada una de las conexiones no comparten los bloqueos. Hay que tener cuidado para asegurarse de que un comando no bloquee otro comando manteniendo bloqueos en filas solicitadas por el otro comando. Si MARS está habilitado, puede haber varios comandos activos en las conexiones y si se utilizan transacciones explícitas, todos los comandos comparten una transacción común.
El consumidor puede cancelar el comando utilizando ISSAbort::Abort o liberando todas las referencias que se mantienen en el objeto de comando y el conjunto de filas derivado.
Si se utiliza IMultipleResults en todas las instancias, el consumidor puede obtener todos los conjuntos de filas generados mediante la ejecución de comandos, determinar apropiadamente cuándo se ha de cancelar la ejecución de comandos y liberar un objeto de sesión para que lo puedan utilizar otros comandos.
[!NOTA]
Si se utilizan cursores de SQL Server, la ejecución de comandos crea el cursor. SQL Server indica si la creación del cursor se ha llevado a cabo correctamente o no; por consiguiente, el viaje de ida y vuelta (round trip) a la instancia de SQL Server se completa cuando se obtiene el resultado de la ejecución del comando. Así, cada llamada a GetNextRows se convierte en un viaje de ida y vuelta (round trip). De esta manera, pueden existir varios objetos de comando activos, y cada uno de ellos procesará un conjunto de filas que es el resultado de una captura del cursor de servidor. Para obtener más información, vea Rowsets and SQL Server Cursors.