O Framework .Net trouxe muitos recursos para nós desenvolvedores. Dentre eles, um dos que eu mais gostei e procuro sempre fazer uso, é a possibilidade do uso de datasets tipados. Neste artigo, vou tentar mostrar um exemplo simples de como criar um aplicativo fazendo uso de um dataset tipado, mostrando a facilidade de manipular os dados com esta técnica.

O que são Datasets Tipados?

Primeiramente, vamos definir o que vem a ser um dataset. Dataset é um objeto pertencente ao ADO.Net, que tem como objetivo ser o repositório de dados deste objeto, possuindo tabelas, colunas, linhas, etc. O objeto dataset também tem recursos para manipulação dos dados nele contidos (inclusão, exclusão e alteração).

Qual é a diferença entre um DataSet e um DataSet fortemente tipado?

Conforme explicado no parágrafo acima, um dataset tipado traz consigo toda a estrutura das tabelas, possibilitando o acesso às colunas do banco de dados como se fossem propriedades do dataset, o que não deixa de ser a pura verdade, uma vez que um dataset tipado nada mais é do que uma classe que o visual studio cria “nos bastidores” colocando o nome de cada coluna de cada tabela como uma propriedade desta classe (que tem o mesmo nome do arquivo xsd criado).

Caso você não esteja utilizando o Visual Studio, também é possível fazer o uso dos datasets tipados, utilizando o aplicativo “XSD.EXE”. Consulte o MSDN para maiores detalhes.

Criando um novo aplicativo ASP.NET no Visual Studio 2003

  1. Inicie o Visual Web Developer 2008 Express(VWD);
  2. No menu File -> New Web Site , selecione o template ASP .NET Web Site, a linguagem C# e informe o nome u_dsTipado;
  3. Na janela Solution Explorer é exibido selecione o arquivo Default.aspx clicando duas vezes sobre o mesmo
    Na janela Solution Explorer é exibido selecione o arquivo Default.aspx clicando duas vezes sobre o mesmo.
  4. Na janela do Editor do VWD , clique em Design para alternar para o modo de design;
  5. A partir da caixa de ferramentas inclua no formulário os seguintes controles (arraste e solte):
    • TextBox: ID= txtNomeProduto
    • TextBox: ID= txtNomeCategoria
    • DataGridView = dgvDS
    • Label: Text=Produto
    • Label: Text=Categoria
  6. Vamos adicionar um DataSet ao projeto, a partir do menu WebSite -> Add New Item, selecione o modelo DataSet e altere o seu nome para : dsProducts.xsd. Observe que o arquivo é na verdade, um esquema XML. Clique em Add . Você verá uma janela solicitando a confirmação para salvar o arquivo na pasta App_Code. Confirme e após isso você verá a página em branco na janela do editor DataSet;
  7. Vamos abrir o DataBase Explorer e selecionar a conexão com o banco de dados Northwind.mdf
    Vamos abrir o DataBase Explorer e selecionar a conexão com o banco de dados Northwind.mdf.
  8. Selecione o objeto Tables e selecione e arraste a tabela Products para o editor DataSet; Uma representação visual do conjunto de resultados que é gerado pelo modo de exibição será exibida na página. Para ver o XML real para o arquivo de esquema, clique no botão XML na janela do editor.
  9. O TableAdaptater é  um DataAdapter especializado para uma tabela especifica de um banco de dados.
    O TableAdaptater é um DataAdapter especializado para uma tabela especifica de um banco de dados.
    • Quanto criamos um dataset tipado, o VS cria duas estruturas, o DataSet e o TableAdapter. O dataset tipado é um dataset normal, que expõe propriedades e métodos que tem o mesmo schema (colunas, tipos de dados) da tabela utilizada como origem. Ele herda suas características da classe DataSet.

      O TableAdaptater é um DataAdapter especializado para uma tabela especifica de um banco de dados. O TableAdapter encapsula em sua estrutura um DataAdapter normal e permite realizar operações diretas com base de dados (via métodos Insert, Update e Delete) e também operações desconectadas através do Dataset tipado.

  10. Você pode ver que cada uma das colunas da tabela é representada como uma propriedade. O DataSet tipado não gerou uma classe, mas uma definição XML do que a classe irá conter; se você selecionar a opção View Code a partir do menu verá a definição do XML gerado.
  11. Para escrever código para exibir o DataSet, clique duas vezes diretamente no formulário da Web. O Code-behind do formulário Web irá mostrar o evento Page_Load onde iremos incluir o código;
  12. Para ter acesso as classes que residem no namespace System.Data.SqlClient, adicione a seguinte instrução using na parte superior do code-behind:
  13. 
        using System.Data.SqlClient;
        

Agora vamos incluir no evento Load da página o código abaixo:


protected void Page_Load(object sender, EventArgs e)
    {
        SqlConnection cn = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=C:\\DADOS\\NORTHWND.MDF;Integrated Security=True");
        SqlCommand cmd = new SqlCommand("select * from Products", cn);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        dsProdutos tds = new dsProdutos();

        da.Fill(tds, tds.Tables[0].TableName);
        
        //exibe no textbox os valores para o primeiro produto: nome e quantidade
        TextBox1.Text = tds.Products[1].ProductName;
        TextBox2.Text = tds.Products[1].QuantityPerUnit;

        gdvProdutos.DataSource = tds;
        gdvProdutos.DataBind();
    }
    
Nota: Observe que a string de conexão usa o banco de dados Northwind.mdf anexado.

Como funciona:

No procedimento de evento Page_Load, criamos um objeto de conexão passando a seqüência de conexão para o construtor padrão da classe SqlConnection:


SqlConnection cn = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=C:\\DADOS\\NORTHWND.MDF;Integrated Security=True");   

Criamos um objeto SqlCommand que, em seguida, é passado para o objeto SqlDataAdapter. Passamos então uma instrução SQL e o novo objeto de conexão para o construtor SqlCommand. O primeiro define a propriedade de CommandText do novo objeto SqlCommand. (Você também pode passar o nome de um procedimento armazenado.)


SqlCommand cmd = new SqlCommand("select * from Products", cn);  

Criamos uma instância do objeto SqlDataAdapter, passando o novo objeto SqlCommand para o construtor:


SqlDataAdapter da = new SqlDataAdapter(cmd);

A seguir criamos os objetos necessários para se conectar ao banco de dados e retornar informações. Observe que é criada uma instância da classe dsProducts: a classe que mapeia para o esquema dsProducts e herda da classe DataSet ;


dsProdutos tds = new dsProdutos();

hamamos o método Fill do SqlDataAdapter, passando no objeto DataSet tipado, e o nome do DataSet digitado usando a propriedade TableName do objeto DataTable:


da.Fill(tds, tds.Tables[0].TableName);     

Se você precisar obter o valor de uma coluna da tabela do dataset para exibir em uma caixa de texto pode usar a propriedade RowIndex;


dsProducts.DataTableName[RowIndex].ColumnName

Para esse exemplo, o RowIndex usado é igual a 1 indicando o segundo produto. Com o código abaixo iremos exibir o nome e quantidade por unidade nas caixas de texto.


TextBox1.Text = tds.Products[1].ProductName;
TextBox2.Text = tds.Products[1].QuantityPerUnit;

Como a coleção de linhas é baseado em zero, quando a página for carregada, observe que os controles TextBox exibem os nomes o nome do produto e a quantidade em estoque do item na segunda linha do GridView.

Para exibir todos os resultados no GridView , defina a propriedade fonte de dados de GridView como o DataSet digitado e chame o método DataBind():


gdvProdutos.DataSource = tds;
gdvProdutos.DataBind();

Abaixo temos o resultado obtido na execução do projeto:

Utilizando Datasets Tipados
Dataset Tipado.