LA.Net
Reflexões sobre C#, .Net e programação em geral

Após algum tempo de ausência, vamos voltar aos posts sobre novidades associadas ao ASP.Net. Hoje vou dar inicio a uma série de posts sobre o novo controlo ObjectDataSource. Este controlo permite-nos relacionar controlos do tipo data bound com os dados obtidos a partir de uma camada de objectos sem necessidade de recorrer a código. Para começar, vamos construir a base de dados e a camada de objectos. Uma vez que a base de dados SQL Server Express é gratuita, vamos utilizá-la para servir de repositório de dados. A base de dados será apenas constituida por uma única tabela de forma a ilustrarmos todas as funcionalidades associadas à utilização do controlo sem nos “desconcentrarmos” com camadas de objectos complexas. A tabela Funcionarios caracteriza cada funcionário através de um ID, nome, morada e telefone. A tabela pode ser criada através do seguinte SCRIPT SQL:

USE [D:\WEBSITES\OBJECTDATASOURCE\APP_DATA\FUNCIONARIOS.MDF]
GO
/****** Object: Table [dbo].[Funcionarios] Script Date: 05/31/2005 00:38:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Funcionarios](
[IdFuncionarios] [int] IDENTITY(1,1) NOT NULL,
[Nome] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Morada] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Telefone] [varchar](9) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
CONSTRAINT [PK_Funcionarios] PRIMARY KEY CLUSTERED
(
[IdFuncionarios] ASC
) ON [PRIMARY]
) ON [PRIMARY]

Bom, agora podemos passar à construção da camada de objectos. Neste caso optei por representar cada registo da tabela através de uma instância da classe Funcionario. Por sua vez, um grupo de funcionários deverá ser representado através de uma colecção instanciada a partir da classe FuncionarioCollection.Todas as operações que envolvem a base de dados serão encapsuladas através da classe FuncionarioRepository. Vamos começar pela classe Funcionario. O seu aspecto é o seguinte:

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

 

 

namespace ObjectDemo

{

    public class Funcionario

    {

        private int _idFuncionario;

        private string _nome;

        private string _morada;

        private string _telefone;

 

 

        public Funcionario( )

            : this( -1, "", "", "" )

        {

        }

 

        public Funcionario( int idFuncionario, string nome, string morada, string telefone )

        {

            _idFuncionario = idFuncionario;

            _nome = nome;

            _morada = morada;

            _telefone = telefone;

 

        }

 

        public int IdFuncionarios

        {

            get

            {

                return _idFuncionario;

            }

            set

            {

                _idFuncionario = value;

            }

        }

 

        public string Nome

        {

            get

            {

                return _nome;

            }

            set

            {

                _nome = value;

            }

        }

 

        public string Morada

        {

            get

            {

                return _morada;

            }

            set

            {

                _morada = value;

            }

        }

 

        public string Telefone

        {

            get

            {

                return _telefone;

            }

            set

            {

                _telefone = value;

            }

        }

    }

}

Um conjunto de funcionários é encapsulado através da seguinte colecção:

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Collections.Generic;

 

namespace ObjectDemo

{

    public class FuncionarioCollection :List<Funcionario>

    {

 

    }

 

}

A classe FuncionarioRepository será construída aos poucos de forma a demonstrar os requisitos associados à utilização do controlo ObjectDataSource. Uma vez que este post já está a tornar-se algo longo, vamos começar por apresentar todos os elementos existentes na base de dados num controlo GridView. Para tal, vamos adicionar um método à classe FuncionarioRepository que é responsável por devolver uma colecção de funcionários:

using System;

using System.Data;

using System.Data.SqlClient;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Web.Configuration;

 

namespace ObjectDemo

{

    public class FuncionarioRepository

    {

        public FuncionarioCollection LoadFuncionarios( )

        {

            FuncionarioCollection funcionarios = new FuncionarioCollection();

            using ( SqlConnection cnn = new SqlConnection( WebConfigurationManager.ConnectionStrings ["funcDB"].ConnectionString ) )

            {

                SqlCommand cmd = new SqlCommand( "select IdFuncionarios, Nome, Morada, Telefone from funcionarios", cnn );

                cnn.Open( );

 

                SqlDataReader reader = cmd.ExecuteReader( CommandBehavior.CloseConnection );

                while ( reader.Read( ) )

                {

                    funcionarios.Add( new Funcionario( reader.GetInt32( 0 ), reader.GetString( 1 ), reader.GetString( 2 ), reader.GetString( 3 ) ) );

                }

                reader.Close( );

            }

            return funcionarios;

        }

    }

}

O método limita-se apenas  a percorrer um data reader e a criar elementos do tipo Funcionario que são utilizados para “popular” a colecção de funcionários. Nesta altura, já temos código suficiente para utilizar o controlo ObjectDataSource. A página seguinte apresenta o código básico necessário à apresentação dos funcionários num controlo GridView:

<%@ Page Language="C#" %>

<html>

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

    <form id="form1" runat="server">

        <h3>Apresenta uma lista de alunos</h3>

            <asp:GridView ID="grid" runat="server" DataSourceID="source">

            </asp:GridView>

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

                TypeName="ObjectDemo.FuncionarioRepository"

                SelectMethod="LoadFuncionarios">

            </asp:ObjectDataSource>

    </form>

</body>

</html>

O controlo ObjectDataSource necessita de duas informações: o tipo responsável pela realização da operação (TypeName) e o método de selecção responsável por obter uma lista de elementos que devem ser apresentados(SelectMethod). No nosso exemplo, todas as operações de apresentação e modificação dos dados são da responsabilidade da classe  ObjectDemo.FuncionarioRepository. Actualmente, esta classe só possui um método (LoadFuncionarios) cujo principal objectivo é apresentar todos os funcionários existentes na base de dados.

No próximo post vamos falar acerca das alterações necessárias ao suporte à ordenação dos dados.

posted on Tuesday, June 28, 2005 10:53 PM
Comments
  • # re: Utilização do controlo ObjectDataSource - parte I
    Israel Aece
    Posted @ 6/28/2005 11:55 PM
    Ola Luis,

    Parabens pelo artigo!

    Só queria comentar: A criação da classe FuncionarioCollection, que na verdade herda de uma List devidamente tipificada (no caso, de objetos do tipo Funcionario), seria apenas por uma questão de gosto ou é mesmo uma boa prática?

    Digo isso porque poderíamos fazer simplesmente:

    Dim funcionarios As New List(Of Funcionarios)

    E dessa forma, não precisaríamos de uma classe segunda classe que é uma collection.
  • # re: Utilização do controlo ObjectDataSource - parte I
    Luis Abreu
    Posted @ 6/29/2005 10:01 AM
    Digamos que e uma questao de gosto. Prefiro ter nomes especificos para as minhas classes como no exemplo anterior, isto e, em vez de ter de list<Funcionarios> prefiro ter FuncionariosCollection.
Title  
Name  
Url
Box Code
Protected by FormShield
Comments