Usando IMultipleResults para processar vários conjuntos de resultados
Os consumidores usam a interface IMultipleResults para processar resultados retornados pela execução de comandos 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 quaisquer resultados.
Um cliente deve processar todos os resultados a partir da execução do comando. Como a execução de comandos do provedor OLE DB do SQL Server Native Client pode gerar objetos com vários conjuntos de linhas como resultados, use a interface IMultipleResults para assegurar que a recuperação de dados do aplicativo conclua a viagem de ida e volta iniciada pelo cliente.
A instrução Transact-SQL a seguir 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 da fonte de dados DBPROP_MULTIPLECONNECTIONS for 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á uma 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 DB_E_OBJECTOPEN se DBPROP_MULTIPLECONNECTIONS for 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 quando usar parâmetros de saída em fluxo e o aplicativo não tiver usado 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 seja um cursor de servidor, e se a propriedade de fonte de dados DBPROP_MULTIPLECONNECTIONS 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 exista uma transação ativa, quando então retornará 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. Cada chamada de GetNextRows se torna então 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, consulte Conjuntos de linha e cursores do SQL Server. |