Partilhar via


Adicionar restrições existentes a um DataSet

Aplica-se a: .NET Framework .NET .NET Standard

Baixar ADO.NET

O Fill método do SqlDataAdapter preenche a DataSet apenas com colunas e linhas da tabela de uma fonte de dados; embora as restrições sejam normalmente definidas pela fonte de dados, o método Preenchimento não adiciona esta informação de esquema ao DataSet por defeito.

Para preencher um DataSet com informação de restrição de chave primária existente de uma fonte de dados, pode chamar o FillSchema método do DataAdapter ou definir a propriedade MissingSchemaAction do DataAdapter para AddWithKey antes de chamar Fill. Isto garantirá que as restrições principais da chave no DataSet refletam as da fonte de dados.

Observação

A informação sobre restrições de chave estrangeira não está incluída e deve ser criada explicitamente.

Adicionar informação de esquema a um DataSet antes de o preencher com dados garante que as restrições de chave primária estão incluídas com os DataTable objetos do DataSet. Como resultado, quando são feitas chamadas adicionais para preencher o DataSet , a informação principal da coluna da chave é usada para corresponder novas linhas da fonte de dados com as linhas atuais em cada DataTable, e os dados atuais nas tabelas são sobrescritos com 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 numa fonte de dados for identificada como auto-incrementada, o FillSchema método, ou o Fill método com o MissingSchemaAction com AddWithKey, cria uma DataColumn com a propriedade AutoIncrement definida como true. No entanto, terá de definir os valores AutoIncrementStep e AutoIncrementSeed você mesmo.

Observação

Usar FillSchema ou definir o MissingSchemaAction para AddWithKey requer processamento adicional na fonte de dados para determinar a informação da coluna da chave principal. Este processamento adicional pode prejudicar o desempenho. Se você souber as informações da chave primária em tempo de design, recomendamos especificar explicitamente a(s) coluna(s) da chave primária para obter o desempenho ideal.

O exemplo de código seguinte mostra como adicionar informação 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ção de esquema a um DataSet usando a MissingSchemaAction propriedade e o Fill método:

// 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"]);
}

Manipulação de vários conjuntos de resultados

Se o DataAdapter atingir múltiplos conjuntos de resultados devolvidos do SelectCommand, irá criar múltiplas tabelas no DataSet. As tabelas receberão um nome incremental padrão baseado em zero, TabelaN, começando por Tabela em vez de "Mesa0". As tabelas receberão um nome incremental baseado em zero, TableNameN, começando por TableName em vez de "TableName0" se o nome de uma tabela for passado como argumento para o método FillSchema.

Consulte também