Partilhar via


Adicionar restrições existentes a um DataSet

Aplicável a: .NET Framework .NET .NET Standard

Baixar ADO.NET

O método Fill de SqlDataAdapter 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.

Observação

As informações de restrição de chave estrangeira não estão incluídas e devem ser criadas explicitamente.

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 incrementação automática, o método FillSchema ou o método Fill 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.

Observação

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.

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

// Assumes that connection is a valid SqlConnection object.
string queryString =
"SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");

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

// Assumes that customerConnection and orderConnection are valid SqlConnection objects.
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", customerConnection);
SqlDataAdapter ordAdapter = new SqlDataAdapter(
"SELECT * FROM Orders", orderConnection);

DataSet customerOrders = new DataSet();

custAdapter.Fill(customerOrders, "Customers");
ordAdapter.Fill(customerOrders, "Orders");

DataRelation relation = customerOrders.Relations.Add("CustOrders",
customerOrders.Tables["Customers"].Columns["CustomerID"],
customerOrders.Tables["Orders"].Columns["CustomerID"]);

foreach (DataRow pRow in customerOrders.Tables["Customers"].Rows)
{
    Console.WriteLine(pRow["CustomerID"]);
    foreach (DataRow cRow in pRow.GetChildRows(relation))
        Console.WriteLine("\t" + cRow["OrderID"]);
}

Manipulando vários conjuntos de resultados

Se o DataAdapter atender 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 Tabela N, começando apenas com Tabela em vez de "Table0". As tabelas receberão um nome incremental partindo do zero correspondente a TableName N, começando com TableName em vez de "TableName0" se um nome de tabela for passado como argumento para o método FillSchema.

Confira também