Usando IMultipleResults para processar vários conjuntos de resultados no SQL Server Native Client
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure PDW (Sistema de Plataforma de Análise) do Azure Synapse Analytics
Os consumidores usam a interface IMultipleResults para processar os resultados retornados pela execução do comando do provedor OLE DB do SQL Server Native Client. Quando o provedor OLE DB do SQL Server Native Client envia um comando para execução, o SQL Server executa as instruções e retorna 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 do SQL Server Native Client pode gerar vários objetos de conjunto de 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 o MARS não estiver habilitado na conexão, nenhum outro comando poderá ser executado no objeto de sessão (o provedor OLE DB do SQL Server Native Client não criará outra conexão) até que o comando seja cancelado. Se o MARS não estiver habilitado na conexão, o provedor OLE DB do SQL Server Native Client retornará um erro de DB_E_OBJECTOPEN se DBPROP_MULTIPLECONNECTIONS estiver VARIANT_FALSE e retornará E_FAIL se houver uma transação ativa.
O provedor OLE DB do 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 o 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 é um cursor de servidor, e se a propriedade DBPROP_MULTIPLECONNECTIONS fonte de dados estiver definida como VARIANT_TRUE, o provedor OLE DB do SQL Server Native Client criará conexões adicionais para dar suporte a objetos de comando simultâneos, a menos que uma transação esteja ativa, caso em que ela 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.