msdn24_capa.jpg

Clique aqui para ler todos os artigos desta edição

 

DataSet e DataTable no ADO.NET 2.0

 

O ADO.NET 2.0 traz algumas melhorias interessantes para as classes básicas do ADO.NET 1.x e introduz uma variedade de classes novas, todas prometendo melhorar o desempenho, a flexibilidade e a eficiência. Houve algumas mudanças importantes mesmo ao longo do ciclo de vida das versões pre-beta e beta do ADO.NET 2.0, assim como as melhorias para o novo processo de batch updating (atualizações em lote). Com a aproximação do lançamento final do ADO.NET 2.0 e o conjunto de novos recursos ficando mais estável, está na hora de dar uma olhada no que vem por aí.

Este mês começarei explorando as melhorias nas classes DataSet e DataTable, o que elas significam para você e quando devem ser utilizadas. Às vezes, no ADO.NET 1.x, especialmente ao trabalhar com grandes conjuntos de dados, você pode ter problemas relacionados ao desempenho.  Discutirei como alguns destes problemas de desempenho no ADO.NET 2.0 foram resolvidos através de mudanças no engine de indexação, falarei sobre as características que foram acrescentadas à classe DataTable e as opções de carga pelo novo método Load e os novos métodos que permitem modificar o estado de um registro (RowState). Na próxima edição desta coluna, discutirei outras melhorias, como a habilidade para executar batch updating, a compressão de DataSets para transporte usando serialização binária, e mais.

Melhorias no DataTable

No ADO.NET 1.x o DataSet obteve todas as “glórias” deixando o DataTable nas “sombras”. Sem falar que o DataTable não era uma classe muito útil por si própria (quando usada sem um DataSet). O DataTable funciona como um conjunto de linhas e colunas e poder ser considerado a principal classe do ADO.NET para armazenar dados desconectados. No entanto, o DataSet é mais interessante porque pode conter uma coleção de objetos DataRelation e DataTable.

Apesar de útil, o DataTable tem algumas limitações no ADO.NET 1.x que o DataSet não tem. Por exemplo, o DataSet expõe um método Merge que pode “fundir” dois objetos DataTable dentro de um DataSet, mas o próprio DataTable não expõe um método Merge. Assim, se você estivesse usando um DataTable (não contido dentro de um DataSet) e você quisesse fundi-lo com outro objeto DataTable, teria que criar antes um objeto DataSet, colocar o primeiro DataTable nele e invocar o método DataSet.Merge, como fiz na Listagem 1.

 

Listagem 1. Fusão de dois objetos DataTable no ADO.NET 1.x

string sqlAllCustomers = "SELECT * FROM Customers";

string cnStr =

  @"Data Source=.;Initial Catalog=northwind;Integrated Security=True";

using (SqlConnection cn = new SqlConnection(cnStr))

{

    cn.Open();

    SqlCommand cmd = new SqlCommand(sqlAllCustomers, cn);

    SqlDataAdapter adpt = new SqlDataAdapter(cmd);

    DataTable dtCust1 = new DataTable("Customers");

    adpt.Fill(dtCust1);

    dtCust1.PrimaryKey = new DataColumn[]{dtCust1.Columns["CustomerID"]};

    DataTable dtCust2 = dtCust1.Clone();

    DataRow row1 = dtCust2.NewRow();

    row1["CustomerID"] = "ALFKI";

    row1["CompanyName"] = "Some Company";

    dtCust2.Rows.Add(row1);

    DataRow row2 = dtCust2.NewRow();

    row2["CustomerID"] = "FOO";

    row2["CompanyName"] = "Some Other Company";

    dtCust2.Rows.Add(row2);

    DataSet ds = new DataSet("MySillyDataSet");

    ds.Tables.Add(dtCust1);

    ds.Merge(dtCust2);

    dgTest.DataSource = dtCust1;

}

 

Não é difícil, mas é chato. No ADO.NET 2.0, o objeto DataTable agora tem um método Merge, assim você pode fundir dois objetos DataTable (sem ter que criar um DataSet), como a seguir: ...

Quer ler esse conteúdo completo? Tenha acesso completo