Usando IMultipleResults para processar vários conjuntos de resultados
Os consumidores usam a interface IMultipleResults para processar os resultados retornados por SQL Server Native Client execução de comando do provedor OLE DB. Quando o SQL Server Native Client provedor OLE DB envia um comando para execução, SQL Server executa as instruções e retorna todos os resultados.
Um cliente deve processar todos os resultados a partir da execução do comando. Como a execução do comando do provedor OLE DB SQL Server Native Client pode gerar objetos de conjunto de várias linhas como resultados, use a interface IMultipleResults para garantir que a recuperação de dados do aplicativo conclua a viagem de ida e volta iniciada pelo cliente.
A seguinte instrução Transact-SQL gera vários conjuntos de linhas, alguns contendo dados de linhas da tabela OrderDetails e alguns contendo resultados da 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
Se um consumidor executar um comando que contém esse texto e solicitar um conjunto de linhas como a interface de resultados retornados, apenas o primeiro conjunto de linhas será retornado. O consumidor pode processar todas as linhas no conjunto de linhas retornado. Mas, se a propriedade DBPROP_MULTIPLECONNECTIONS fonte de dados estiver definida como VARIANT_FALSE e MARS não estiver habilitada na conexão, nenhum outro comando poderá ser executado no objeto de sessão (o provedor OLE DB SQL Server Native Client não criará outra conexão) até que o comando seja cancelado. Se MARS não estiver habilitado na conexão, o provedor OLE DB SQL Server Native Client retornará um erro DB_E_OBJECTOPEN se DBPROP_MULTIPLECONNECTIONS for VARIANT_FALSE e retornará E_FAIL se houver uma transação ativa.
O provedor OLE DB SQL Server Native Client também retornará DB_E_OBJECTOPEN ao usar parâmetros de saída transmitidos e o aplicativo não consumiu todos os valores de parâmetro de saída retornados antes de chamar IMultipleResults::GetResults para obter o próximo conjunto de resultados. Se MARS não estiver habilitado e a conexão estiver ocupada executando um comando que não produz um conjunto de linhas ou que produz um conjunto de linhas que não seja um cursor de servidor e se a propriedade de fonte de dados DBPROP_MULTIPLECONNECTIONS estiver definida como VARIANT_TRUE, o provedor SQL Server Native Client OLE DB criará conexões adicionais para dar suporte a objetos de comando simultâneos, a menos que uma transação esteja ativa, nesse caso, ele retorna um erro. As transações e o bloqueio são gerenciados pelo SQL Server por conexão. Se uma segunda conexão for gerada, o comando nas conexões separadas não compartilhará bloqueios. É necessário ser cuidadoso em assegurar que um comando não bloqueie outro ao manter bloqueios em linhas solicitadas pelo outro comando. Se o MARS estiver habilitado, vários comandos poderão estar ativos nas conexões e, se estiverem sendo usadas transações explícitas, todos os comandos compartilharão uma transação comum.
O consumidor pode cancelar o comando usando ISSAbort::Abort ou liberando todas as referências mantidas no objeto de comando e no conjunto de linhas derivado.
O uso de IMultipleResults em todas as instâncias permite que o consumidor obtenha todos os conjuntos de linhas gerados pela execução do comando e permite que os consumidores determinem apropriadamente quando cancelar a execução do comando e liberar um objeto de sessão para uso por outros comandos.
Observação
Ao usar cursores do SQL Server, a execução de comandos cria o cursor. O SQL Server retorna o êxito ou a falha da criação do cursor; assim, a viagem de ida e volta à instância do SQL Server é concluída no retorno da execução do comando. Em seguida, cada chamada de GetNextRows se torna uma viagem de ida e volta. Dessa forma, podem existir vários objetos de comando ativos, cada um processando um conjunto de linhas que é o resultado uma busca do cursor de servidor. Para obter mais informações, confira Conjuntos de linha e cursores do SQL Server.