msdn33_capa.jpg

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

 

ObjectDataSource

por Fábio Serratto

Nos projetos com .NET Framework, muitos desenvolvedores utilizam amplamente os DataSets para desempenhar as funções de gerenciamento de dados, principalmente por ser uma ferramenta extremamente versátil e integrada com o framework. Isso é válido até o momento onde nossos projetos começam a tomar proporções maiores e as necessidades de tratamento da complexidade dos sistemas se ampliam, nesse caso os DataSets podem acabar dando um pouco de dor de cabeça.

Para tratar os cenários mais complexos, precisamos de uma estrutura mais robusta de classes e componentes que permitam gerenciar melhor nossas transações, indo além das coleções de linhas e colunas. Esse tipo de desenvolvimento gera uma sobrecarga de trabalho quando queremos integrar nossas classes de domínio com a camada de apresentação, não é tão transparente quanto o uso de DataSets, mas na versão 2.0 do .NET isso ficou extremamente mais fácil.

O ObjectDataSource fornece uma engine que permite integrar nossos objetos na estrutura de binding dos dados, sem muitos esforços.

Nota: Para uma introdução ao uso de ObjectDataSources, veja a edição 25.

Entendendo um pouco melhor o ObjectDataSource

O ObjectDataSource, como o próprio nome indica, usa um Objeto como o responsável pelas funcionalidades de manipulação dos dados (inserção, recuperação, atualização e exclusão). Para mapear esse objeto no ObjectDataSource usamos a propriedade TypeName.

Apesar de ser simples, precisamos seguir algumas regras para que o nosso objeto seja usado da maneira adequada pelo ObjectDataSource:

·        Cada vez que ele precisar fazer uma das operações de manipulação de dados, ele vai tentar encontrar através de Reflection (*) o método correto para chamar (necessariamente temos que fornecer algumas dicas para ajudá-lo);

·        Se for um método estático (static), ele vai recuperar os parâmetros e efetuar sua chamada;

·        Se for um método de instância, ele vai criar um objeto daquela classe, vai chamar o método e por fim destruir a instância criada.

(*) toda vez que um método é chamado, o ObjectDataSource busca novamente o método e o chama, não existe mecanismos de cache para essas chamadas.

Para especificarmos os métodos de manipulação de dados usamos as propriedades SelectMethod, InsertMethod, UpdateMethod e DeleteMethod do ObjectDataSource. Caso desejemos apenas recuperar dados, não precisamos especificar as outras propriedades (opcionais), como temos na Listagem 1.

 

Listagem 1. Visão parcial das propriedades do ObjectDataSource

<asp:ObjectDataSource ID="ODSource" runat="server"

......

TypeName="objetoCRUD"

SelectMethod="getDados"

InsertMethod="insertDados"

UpdateMethod="updateDados"

DeleteMethod="deleteDados">

asp:ObjectDataSource>

 

O ObjectDataSource aceita duas formas de passagem de parâmetros: Tipos Simples e Objetos. Se estivermos usando a primeira forma, o método deverá ter pelo menos um parâmetro para cada valor que estiver associado (bound), podendo ainda ter alguns parâmetros extras (que veremos logo a seguir).

Se usarmos a segunda forma, o parâmetro será um objeto contemplando pelo menos uma propriedade para cada valor associado (bound), podendo também ter alguns parâmetros extras. O controle tem uma propriedade chamada DataObjectTypeName, que quando especificada, indica que estaremos usando o segundo modo de passagem de parâmetros e o objeto referenciado nessa propriedade será usado como parâmetro.

Caso contrário estará usando o primeiro modo (tipos simples). A maioria dos parâmetros citados anteriormente podem ser especificados para cada método de manipulação, através da coleção específica, conforme vemos na Listagem 2.

 

Listagem 2. Coleção de parâmetros para os métodos de manipulação de dados com uso de tipos simples

<asp:ObjectDataSource ID="ODSource" runat="server"

TypeName="objetoCRUD"

SelectMethod="getDados"

InsertMethod="insertDados"

UpdateMethod="updateDados"

DeleteMethod="deleteDados">

<SelectParameters>

<%--Coleção de parâmetros para o método Select--%>

  <asp:Parameter Name="parm1" Type="decimal"

    Direction="input" />

  SelectParameters>

  <InsertParameters>

<%--Coleção de parâmetros para o método Insert--%>

  <asp:Parameter Name="parm1" Type="decimal"

    Direction="input" />

  InsertParameters>

  <UpdateParameters>

<%--Coleção de parâmetros para o método Update--%>

  <asp:Parameter Name="parm1" Type="decimal"

    Direction="input" />

  UpdateParameters>

  <DeleteParameters>

<%--Coleção de parâmetros para o método Delete--%>

  <asp:Parameter Name="parm1" Type="decimal"

    Direction="input" />

  DeleteParameters>

asp:ObjectDataSource>

Preparando o ambiente

Para melhor entender o uso do ObjectDataSource vamos desenvolver uma pequena aplicação Web para manipulação de uma lista simples de contatos. Para isso devemos preparar o nosso ambiente.  Crie um novo site no Visual Studio 2005 usando o template ASP.NET Web Site (Figura 1).

 

image002.jpg

Figura 1. Criação do Projeto no Visual Studio 2005

Adicione um banco de dados na pasta App_Data (Figura 2), usando a opção  SQL Database na janela New Itens.

 

image004.jpg

Figura 2. Banco de dados na pasta App_Data

Crie a tabela “contatos” no banco , atentando para o campo ID, que deve ser definido como chave primária e deve ser Identity (Figura 3).

 

image006.jpg

Figura 3. Criação da tabela de Contatos

Adicione um novo arquivo do tipo Web Configuration File (web.config) ao projeto. Após o ambiente preparado, vamos criar a base de negócios que utilizaremos aqui. O uso do ObjectDataSource será através da opção com parâmetros do tipo Objeto e, como descrito anteriormente, precisamos de uma classe que exponha as propriedades que servirão de parâmetros para nossas ações.

A classe Contatos (adicione uma nova classe ao projeto, salvando-a como “Contatos.cs”) expõe as propriedades que mapeiam nossa tabela recém criada. Veja a implementação da classe na Listagem 3.

 

Listagem 3. Classe de contatos

using System;

 

///

/// Classe de contatos

///

public class Contatos

{

    public Contatos()

    {

        _id = -1;

    }

    public Contatos(int id, string nome, string email,

      string telefone)

    {

        _id = id;

        _nome = nome;

        _email = email;

        _telefone = telefone;

    }

    protected int _id;

    protected string _nome;

    protected string _email;

    protected string _telefone;

    public int Id

    {

        get { return ...

Quer ler esse conteúdo completo? Tenha acesso completo