Exportar (0) Imprimir
Expandir Tudo

Trabalhando com DataSet tipado em C# e VB .NET – Parte 1

Por Marden Menezes

Uma das principais dificuldades encontradas quando programamos utilizando orientação a objetos e aplicações em camadas é o mapeamento das informações da interface gráfica em objetos que representam entidades do sistema e depois mapear tais objetos em um banco de dados relacional. A utilização do que chamamos de “objetos de negócios” na camada intermediária acaba trazendo perda de produtividade e aumento da complexidade do sistema.

Vamos dar um exemplo prático da situação: Uma interface gráfica com alguns campos em textBox precisa ser preenchida com informações do banco de dados. Seguindo uma arquitetura em três camadas com objetos de negócios, nós teríamos, por exemplo, algum código parecido com esse para recuperar informações do banco de dados em um objeto dataReader e preencher um objeto do tipo Cliente em uma camada de negócios para validação dos dados.

// código em C#
//execução de código que cria um SqlCommand para preencher um SqlDataReader
//preenche o SqlDataReader
SqlDataReader dr = comando.ExecuteReader();
//cria um objeto do tipo Cliente
Cliente cli = new Cliente();
cli.CPF = dr.GetString(0);
cli.Nome = dr.GetString(1);
cli.Idade = dr.GetInt32(2);

‘código em Visual Basic .NET
‘execução de código que cria um SqlCommand para preencher um SqlDataReader
‘preenche o SqlDataReader
Dim dr As SqlDataReader = comando.ExecuteReader()
‘cria um objeto do tipo Cliente
Dim cli As New Cliente
cli.CPF = dr.GetString(0)
cli.Nome = dr.GetString(1)
cli.Idade = dr.GetInt32(2)

Após esse processo de formação do objeto onde temos toda a validação das informações com as restrições e lógica de negócios, passamos para a idéia de preenchermos os campos em textBox na interface gráfica. Para tal nós teríamos então que “abrir” o objeto que foi formado para recuperar suas informações e inserir no banco de dados:

//código em C#
//algum código para recuperar o objeto cliente da camada de negócios
//(...)
this.txtNome.Text = cli.Nome;
this.txtCpf.Text = cli.Cpf;
this.txtIdade.Text = cli.Idade.ToString();

‘código em VB .NET
‘algum código para recuperar o objeto cliente da camada de negócios
‘(...)

this.txtNome.Text = cli.Nome
this.txtCpf.Text = cli.Cpf
this.txtIdade.Text = cli.Idade.ToString()

Todo esse problema vem do fato de que os objetos de negócio não possuem uma forma de preencher dados na interface gráfica automaticamente, assim como não há como preencher informações no objeto cliente vindas do banco de dados automaticamente. Precisamos de um objeto capaz de representar as tabelas, relacionamentos e restrições da base de dados e que também seja fortemente tipado para podermos usá-lo como objeto de negócio. Outra importante consideração é o fato de que tal objeto não pode ter sua estrutura dependente de banco de dados para que possamos manter a independência do banco nas outras camadas da aplicação que usarão o objeto.

Uma nova arquitetura proposta pela Microsoft utiliza o DataSet como objeto de negócio representando as entidades da aplicação. Como o DataSet é um objeto que tem sua implementação independente de base de dados, ele se encaixa perfeitamente nas nossas necessidades.

Um problema de um dataset comum é o fato de que ele não possui estrutura, restrições e tipos dos dados antes de ser preenchido. Para permitir por exemplo que os dados da interface gráfica preencham um dataSet e depois esse dataSet preencha a base de dados é necessário que o dataSet, mesmo vazio, possua a estrutura dos dados já em seu esquema. “Esquema” é a palavra chave que vai fazer com que definamos um dataSet estruturado. Sabemos que um DataSet é um objeto definido em XML e a forma de estruturarmos um objeto XML e definir os tipos das informações é através de um Schema XML.

DataSet tipado – definindo o Schema XML

Schema XML é um documento escrito em XML que define os tipos, a ordem, a cardinalidade e demais informações sobre os membros de um documento XML. Se estivermos trabalhando no Visual Studio .NET e quisermos adicionar um novo item ao nosso projeto (Menu Project -> Add New Item), teremos a opção de criar um novo dataSet.

Cc517968.Datasettipado_parte11(pt-br,MSDN.10).gif

Perceba que o DataSet nada mais é do que um arquivo .xsd, que representa um Schema XML. O editor do Schema XML no Visual Studio nos dá a possibilidade de inserir elementos, atributos, relacionamentos, chaves primárias através da toolBox. Assim você pode definir, como se estivesse desenhando tabelas de banco de dados, todo o esquema que vai representar o seu DataSet. Um outra forma mais rápida de criar o esquema para seu DataSet é arrastando a tabela do Server Explorer até a área de design do DataSet que já é gerado o desenho com a estrutura da tabela e todo o código do Schema será gerado.

Utilizando o banco de dados Northwind do SQL Server, podemos arrastar do Server Explorer as tabelas Customers e Orders. Traduzimos então seus componentes tendo agora então as tabelas Clientes e Pedidos. Podemos agora adicionar um relacionamento entre essas duas tabelas diretamente no Schema do DataSet. Clicando com o botão direito em uma das tabelas, podemos adicionar um relacionamento entre elas.

Cc517968.Datasettipado_parte12(pt-br,MSDN.10).gif

Teremos então que preencher as informações sobre esse relacionamento na tela de edição do relacionamento. Definimos como “Parent element” a tabela Clientes e como “Child element” a tabela Pedidos. Definimos então como “Key Fields” e o “Foreign Key Fields” a coluna id_cliente de cada uma das tabelas.

Para possibilitar que cada modificação na tabela Clientes possa ser refletida na tabela Pedidos, vamos configurar as DataSet Properties no Update, Delete e Accept/Reject rules para Cascade

Cc517968.Datasettipado_parte13(pt-br,MSDN.10).gif

Após a definição do relacionamento nós já podemos utilizar o DataSet que estamos criando. Tal arquivo XML Schema (dsCliente.xsd) está ligado a um arquivo em linguagem de programação (dsCliente.cs ou dsCliente.vb) que nada mais é do que uma classe que herda de System.Data.DataSet e que utiliza a estrutura definida no Schema para formar o DataSet. Ao habilitar a possibilidade de ver todos os arquivos do projeto você poderá ver o arquivo de código e analisar o código gerado pelo Visual Studio.

Após termos definido a estrutura do DataSet tipado (cujo tipo é dsCliente) podemos criar um objeto desse DataSet para trabalharmos com ele:

//código em C#
dsCliente cliente = new dsCliente();

‘código em Visual Basic .NET
Dim cliente as New dsCliente

Perceba que não precisamos mais utilizar um objeto do tipo DataSet mas sim utilizar um objeto do tipo que definimos no Schema XML.

No próximo artigo falaremos de como preenhcer os dados do DataSet tipado com o objeto XXXDataAdapter, trabalhando com o mapeamento dos nomes de tabelas e colunas do DataSet com o banco de dados, além de utilizar a facilidade de DataBinding para ligar o DataSet tipado a controles de interface gráfica. Até lá!

Marden Menezes é MCP, MCAD, MCSD .NET e representa a Microsoft nas universidades como Microsoft Student Ambassador. Criador e líder do primeiro e maior grupo de usuários .NET do Brasil, o Sharp Shooters (www.sharpshooters.org.br), Marden vem trabalhando junto com a INETA(www.ineta.org) e a MSDN Brasil para difundir os grupos de usuários .NET e as células acadêmicas no Brasil, além de divulgar a plataforma escrevendo artigos e ministrando palestras e treinamentos em todo o país. Marden foi premiado como Microsoft Most Valuable Professional pelo seu trabalho de divulgação da Plataforma .NET e da linguagem C#.

Mostrar:
© 2014 Microsoft