Adicionar restrições existentes a um DataSet

O método Fill de DataAdapter preenche um DataSet somente com colunas e linhas da tabela de uma fonte de dados; embora as restrições normalmente sejam definidas pela fonte de dados, o método Fill não adiciona essas informações de esquema ao DataSet por padrão. Para preencher um DataSet com as informações de restrição de chave primária existentes de uma fonte de dados, você pode chamar o método FillSchema do DataAdapter ou definir a propriedade MissingSchemaAction do DataAdapter como AddWithKey antes de chamar o método Fill. Isso fará com que as restrições de chave primária do DataSet reflitam as restrições da fonte de dados. As informações de restrição de chave estrangeira não estão incluídas e devem ser criadas explicitamente, como mostrado em Restrições da DataTable.

A adição de informações de esquema a um DataSet antes de preenchê-lo com os dados desejados faz com que as restrições de chave primária sejam incluídas com os objetos DataTable no DataSet. Como resultado, quando as chamadas adicionais para preencher o DataSet são feitas, as informações da coluna de chave primária são usadas para fazer a correspondência de novas linhas da fonte de dados com as linhas atuais de cada DataTable, e os dados atuais das tabelas são substituídos pelos dados da fonte de dados. Sem as informações do esquema, as novas linhas da fonte de dados são acrescentadas ao DataSet, resultando em linhas duplicadas.

Observação

Se uma coluna em uma fonte de dados for identificada como de incremento automática, o método FillSchema ou o método MissingSchemaAction com uma MissingSchemaAction de AddWithKey, criará uma DataColumn com uma propriedade AutoIncrement definida como true. No entanto, você precisará definir os valores de AutoIncrementStep e AutoIncrementSeed por conta própria. Para mais informações sobre o incremento automático de colunas, confira Como criar colunas de preenchimento automático.

O uso do FillSchema ou a definição do MissingSchemaAction como AddWithKey requer processamento extra na fonte de dados para determinar as informações da coluna de chave primária. Esse processamento adicional pode prejudicar o desempenho. Se você souber as informações de chave primária em tempo de design, recomendamos especificar explicitamente a coluna (ou colunas) de chave primária, a fim de alcançar um desempenho ideal. Para informações sobre como definir explicitamente informações de chave primária para uma tabela, confira Definir chaves primárias.

O seguinte exemplo de código mostra como adicionar informações de esquema a um DataSet usando FillSchema:

Dim custDataSet As New DataSet()  
  
custAdapter.FillSchema(custDataSet, SchemaType.Source, "Customers")  
custAdapter.Fill(custDataSet, "Customers")  
var custDataSet = new DataSet();  
  
custAdapter.FillSchema(custDataSet, SchemaType.Source, "Customers");  
custAdapter.Fill(custDataSet, "Customers");  

O seguinte exemplo de código mostra como adicionar informações de esquema a um DataSet usando a propriedade MissingSchemaAction.AddWithKey e o método Fill:

Dim custDataSet As New DataSet()  
  
custAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey  
custAdapter.Fill(custDataSet, "Customers")  
var custDataSet = new DataSet();  
  
custAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;  
custAdapter.Fill(custDataSet, "Customers");  

Manipulando vários conjuntos de resultados

Se o DataAdapter encontrar a vários conjuntos de resultados retornados de SelectCommand, ele criará várias tabelas no DataSet. As tabelas receberão um nome padrão incremental partindo do zero correspondente a TabelaN, começando apenas com Tabela em vez de "Table0". Se um nome de tabela for passado como um argumento para o método FillSchema, as tabelas receberão um nome incremental baseado em zero de TableNameN, começando com TableName, em vez de "TableName0".

Observação

Se o método FillSchema do objeto OleDbDataAdapter for chamado para um comando que retorna vários conjuntos de resultados, somente as informações de esquema do primeiro conjunto de resultados serão retornadas. Ao retornar informações de esquema para vários conjuntos de resultados usando o OleDbDataAdapter, é recomendável especificar uma MissingSchemaAction de AddWithKey e obter as informações de esquema ao chamar o método Fill.

Confira também