Uso de IMultipleResults para procesar varios conjuntos de resultados en SQL Server Native Client
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Los consumidores usan la interfaz IMultipleResults para procesar los resultados devueltos por 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 los 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 de conjunto de filas múltiples como resultados, use la interfaz IMultipleResults para asegurarse de que la recuperación de datos de la aplicación completa el recorrido de ida y vuelta iniciado por el cliente.
La siguiente instrucción Transact-SQL genera varios conjuntos de filas, algunos con datos de filas de la tabla OrderDetails y otros con 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. Sin embargo, si la propiedad de origen de datos DBPROP_MULTIPLECONNECTIONS está establecida en VARIANT_FALSE y MARS no está habilitada 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 está 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 al usar parámetros de salida transmitidos y la aplicación no ha consumido todos los valores de parámetro 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 si la propiedad del 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 una transacción esté activa, en cuyo caso devuelve 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 mediante ISSAbort::Abort o al liberar todas las referencias que se mantienen en el objeto de comando y el conjunto de filas derivado.
Si se usa 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 usar 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 recorrido de ida y vuelta. 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 Conjuntos de filas y cursores de SQL Server.