Partilhar via


Usando IMultipleResults para processar vários conjuntos de resultados

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Base de dados SQL no Microsoft Fabric

Baixar driver OLE DB

Os consumidores utilizam a interface IMultipleResults para processar resultados devolvidos pelo OLE DB Driver para a execução de comandos SQL Server. Quando o OLE DB Driver para SQL Server submete um comando para execução, o SQL Server executa as instruções e retorna quaisquer resultados.

Um cliente deve processar todos os resultados da execução de comandos. Como o Driver OLE DB para execução de comandos SQL Server pode gerar objetos de múltiplas linhas como resultados, utilize a interface IMultipleResults para garantir que a recuperação de dados da aplicação completa a viagem de ida e volta iniciada pelo cliente.

A seguinte instrução Transact-SQL gera múltiplos conjuntos de linhas, alguns contendo dados de linhas da tabela OrderDetails e outros com 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 contendo este texto e solicitar um conjunto de linhas como interface de resultados retornados, apenas o primeiro conjunto de linhas é devolvido. O consumidor pode processar todas as linhas do conjunto de linhas devolvidas. Mas, se a propriedade da fonte de dados DBPROP_MULTIPLECONNECTIONS estiver definida para VARIANT_FALSE e o MARS não estiver ativado na ligação, nenhum outro comando pode ser executado no objeto de sessão (o Driver OLE DB para SQL Server não criará outra ligação) até que o comando seja cancelado. Se o MARS não estiver ativado na ligação, o Driver OLE DB para SQL Server devolve um erro de DB_E_OBJECTOPEN se DBPROP_MULTIPLECONNECTIONS estiver VARIANT_FALSE e devolve E_FAIL se houver uma transação ativa.

O Driver OLE DB para SQL Server também devolverá DB_E_OBJECTOPEN ao usar parâmetros de saída em fluxo e a aplicação não consumiu todos os valores dos parâmetros de saída retornados antes de chamar IMultipleResults::GetResults para obter o próximo conjunto de resultados. Se o MARS não estiver ativado e a ligação estiver ocupada a executar 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 da fonte de dados DBPROP_MULTIPLECONNECTIONS estiver definida para VARIANT_TRUE, o Driver OLE DB para SQL Server cria ligações adicionais para suportar objetos de comando concorrentes, a menos que uma transação esteja ativa, caso em que devolve um erro. As transações e o bloqueio são geridos pelo SQL Server por cada ligação. Se for gerada uma segunda ligação, o comando nas ligações separadas não partilha bloqueios. Deve-se ter cuidado para garantir que um comando não bloqueia outro mantendo bloqueios nas linhas solicitadas pelo outro comando. Se o MARS estiver ativado, múltiplos comandos podem estar ativos nas ligações e, se forem usadas transações explícitas, todos os comandos partilham uma transação comum.

O consumidor pode cancelar o comando usando ISSAbort::Abort ou libertando todas as referências mantidas no objeto de comando e no conjunto de linhas derivado.

A utilização do IMultipleResults em todas as instâncias permite ao consumidor obter todos os conjuntos de linhas gerados pela execução de comandos e permite aos consumidores determinar adequadamente quando cancelar a execução de comandos e libertar um objeto de sessão para uso por outros comandos.

Observação

Quando usas cursores SQL Server, a execução de comandos cria o cursor. O SQL Server devolve sucesso ou falha na criação do cursor; portanto, a viagem de ida e volta até à instância do SQL Server está completa após o regresso da execução do comando. Cada chamada GetNextRows torna-se então uma viagem de ida e volta. Desta forma, podem existir múltiplos objetos de comando ativos, cada um a processar um conjunto de linhas que resulta de um fetch do cursor do servidor. Para mais informações, consulte Rowsets e SQL Server Cursors.

Ver também

Comandos