Partilhar via


Inserindo dados em parâmetros de Table-Valued

O Provedor OLE DB do SQL Server Native Client dá suporte a dois modelos para que o consumidor especifique dados para linhas de parâmetro com valor de tabela: um modelo de push e um modelo de pull. Um exemplo que demonstra que o modelo de pull está disponível; consulte exemplos de programação de dados do SQL Server.

Observação

Uma coluna de parâmetro com valor de tabela deve ter valores não padrão em todas as linhas ou valores padrão em todas as linhas. Não é possível ter valores padrão em algumas linhas, mas não em outras. Portanto, em associações de parâmetro com valor de tabela, os únicos valores de status permitidos para dados de coluna de conjunto de linhas de parâmetro com valor de tabela são DBSTATUS_S_ISNULL e DBSTATUS_S_OK. DBSTATUS_S_DEFAULT resultará em uma falha e o valor de status associado será definido como DBSTATUS_E_BADSTATUS.

Modelo push (carrega todos os Table-Valued dados do Paremeter na memória)

O modelo de push é semelhante ao uso de conjuntos de parâmetros (ou seja, o parâmetro DBPARAMS em ICommand::Execute). O modelo de push só será usado se objetos de conjunto de linhas de parâmetro com valor de tabela forem usados sem uma implementação personalizada de interfaces IRowset. O modelo de push é recomendado quando o número de linhas no conjunto de linhas de parâmetro com valor de tabela é pequeno e não é esperado que coloque pressão excessiva de memória no aplicativo. Isso é mais simples do que o modelo de pull, pois ele não exige mais funcionalidade do aplicativo do consumidor do que o que é comum atualmente em aplicativos OLE DB típicos.

Espera-se que o consumidor forneça todos os dados de parâmetro com valor de tabela para o provedor antes de executar um comando. Para fornecer os dados, o consumidor preenche um objeto de conjunto de linhas de parâmetro com valor de tabela para cada parâmetro com valor de tabela. O objeto de conjunto de linhas de parâmetro com valor de tabela expõe as operações Inserir, Definir e Excluir do conjunto de linhas, que o consumidor usará para manipular os dados de parâmetro com valor de tabela. O provedor buscará os dados desse objeto de conjunto de linhas de parâmetro com valor de tabela no momento da execução.

Quando um objeto de conjunto de linhas de parâmetro com valor de tabela é fornecido ao consumidor, o consumidor pode processá-lo como um objeto de conjunto de linhas. O consumidor pode obter as informações de tipo de cada coluna (tipo, comprimento máximo, precisão e escala) usando o método de interface IColumnsInfo::GetColumnInfo ou IColumnsRowset::GetColumnsRowset. Em seguida, o consumidor cria um acessador para especificar as associações para os dados. A próxima etapa é inserir linhas de dados no conjunto de linhas de parâmetro com valor de tabela. Isso pode ser feito usando IRowsetChange::InsertRow. IRowsetChange::SetData ou IRowsetChange::D eleteRows também podem ser usados no objeto de conjunto de linhas de parâmetro com valor de tabela se você precisar manipular os dados. Objetos de conjunto de linhas de parâmetro com valor de tabela são contados de referência, semelhantes aos objetos de fluxo.

Se IColumnsRowset::GetColumnsRowset for usado, haverá chamadas subsequentes para os métodos IRowset::GetNextRows, IRowset::GetData e IRowset::ReleaseRows no objeto rowset da coluna resultante.

Depois que o provedor OLE DB do SQL Server Native Client começar a executar o comando, os valores de parâmetro com valor de tabela serão buscados desse objeto de conjunto de linhas de parâmetro com valor de tabela e enviados para o servidor.

O modelo de push requer um trabalho mínimo do consumidor, mas usa mais memória do que o modelo de pull, pois todos os dados de parâmetro com valor de tabela precisam estar na memória no momento da execução.

Modelo de pull (obtendo dados de parâmetro Table-Valued sob demanda do consumidor)

O modelo de pull é útil para dois cenários:

  • Para transmitir linhas.

  • Se um conjunto de linhas de outro provedor estiver sendo usado como o valor do parâmetro com valor de tabela.

No modelo de pull, o consumidor fornece dados sob demanda para o provedor. Use essa abordagem se o aplicativo tiver muitas inserções de dados e dados de conjunto de linhas de parâmetro com valor de tabela na memória resultarão em acesso excessivo à memória. Se vários provedores OLE DB forem usados, o modelo de pull do consumidor permitirá que o consumidor forneça qualquer objeto de conjunto de linhas como o valor do parâmetro com valor de tabela.

Para usar o modelo de pull, os consumidores precisam fornecer sua própria implementação de um objeto de conjunto de linhas. Ao usar o modelo de pull com conjuntos de linhas de parâmetro com valor de tabela (CLSID_ROWSET_TVP), o consumidor é obrigado a agregar o objeto de conjunto de linhas de parâmetro com valor de tabela que o provedor expõe por meio do método ITableDefinitionWithConstraints::CreateTableWithConstraints ou do método IOpenRowset::OpenRowset. Espera-se que o objeto do consumidor substitua apenas a implementação da interface IRowset. Você deve substituir as seguintes funções:

  • IRowset::GetNextRows

  • IRowset::AddRefRows

  • IRowset::GetData

  • IRowset::ReleaseRows

  • IRowset::RestartPosition

O Provedor OLE DB do SQL Server Native Client lerá uma ou mais linhas de cada vez do objeto de conjunto de linhas do consumidor para dar suporte ao comportamento de streaming em parâmetros com valor de tabela. Por exemplo, o usuário pode ter os dados do conjunto de linhas de parâmetro com valor de tabela no disco (não na memória) e pode implementar a funcionalidade para ler dados do disco quando exigido pelo Provedor OLE DB do SQL Server Native Client.

O consumidor comunicará seu formato de dados ao Provedor OLE DB do SQL Server Native Client usando IAccessor::CreateAccessor no objeto de conjunto de linhas de parâmetro com valor de tabela. Ao ler dados do buffer do consumidor, o provedor verifica se todas as colunas graváveis e não padrão estão disponíveis por meio de pelo menos um identificador de acessador e usa os identificadores correspondentes para ler dados de colunas. Para evitar ambiguidade, deve haver uma correspondência um-para-um entre uma coluna de conjunto de linhas de parâmetro com valor de tabela e uma associação. Associações duplicadas à mesma coluna resultarão em um erro. Além disso, espera-se que cada acessador tenha o membro iOrdinal de DBBindings em sequência. Haverá tantas chamadas para IRowset::GetData quanto o número de acessadores por linha e a ordem das chamadas será baseada na ordem do valor iOrdinal de valores inferiores a mais altos.

Espera-se que o provedor implemente a maioria das interfaces expostas pelo objeto de conjunto de linhas de parâmetro com valor de tabela. O consumidor implementará um objeto de conjunto de linhas com interfaces mínimas (IRowset). Devido à agregação cega, as interfaces de objeto de conjunto de linhas obrigatórias restantes serão implementadas pelo objeto de conjunto de linhas de parâmetro com valor de tabela.

Para qualquer outro objeto de conjunto de linhas, como objetos de conjunto de linhas obtidos para qualquer provedor OLE DB, o conjunto de linhas fornecido pelo consumidor deve implementar todas as interfaces de objeto de conjunto de linhas obrigatórias, conforme especificado na especificação OLE DB.

No momento da execução, o Provedor OLE DB do SQL Server Native Client chamará de volta ao objeto de conjunto de linhas para buscar linhas e ler dados de coluna.

Consulte Também

Parâmetros deTable-Valued (OLE DB)
Usar parâmetros de Table-Valued (OLE DB)