ASP.NET 2.0 - O controle de dados ObjectDatasource


Se você quer criar páginas na internet para interagir com banco de dados tem a obrigação de conhecer os novos controles de acesso a dados da ASP.NET versão 2.0.

Podemos visualizar os principais controles de acesso a dados a partir da ToolBox do Visual Web Developer Express:

  • SqlDataSource
  • AccessDataSource
  • ObjectDataSource
  • XmlDataSource
  • SiteMapDataSource

Cada um deles tem um propósito específico e neste artigo vamos ver como podemos usar estes controles para acessar dados e exibi-los em páginas ASP.NET. Vamos lá...

Para acompanhar este artigo você necessitará dos seguintes recursos (todos gratuitos) instalados:

  • Visual Web Developer Express Edition
  • SQL Server 2005 Express Edition
  • Banco de dados Northwind

Usando o controle ObjectDataSource

O ObjectDataSource é um controle de origem de dados ASP.NET que representa um objeto de camada intermediária que reconhece dados ou um objeto de interface de dados para controles ligados a dados. Você pode usar o controle ObjectDataSource em conjunto com um controle ligado a dados para exibir, editar, e classificar dados em uma página da Web com pouco ou nenhum código.

Uma aplicação prática de design de aplicativo muito comum é separar a camada de apresentação da lógica comercial e encapsular a lógica comercial em objetos comerciais. Esses objetos comerciais formam uma camada distinta entre a camada de apresentação e a camada de dados, resultando em uma arquitetura de aplicativo em três camadas. O controle ObjectDataSource permite aos desenvolvedores usar um controle de fonte de dados ASP.NET mantendo sua arquitetura de aplicativo em três camadas.

O controle ObjectDataSource usa Reflection para criar instâncias de objetos comerciais e para chamar métodos para recuperar, atualizar, inserir e excluir dados. A propriedade TyepeName identifica o nome da classe com a qual o controle ObjectDataSource funciona. O controle ObjectDataSource cria e destrói uma instância da classe para cada chamada de método; ele não tem o objeto na memória para o tempo de vida da solicitação da Web. Esta é uma consideração séria se o objeto comercial que você usar requerer muitos recursos ou caso contrário é dispendioso para criar e destruir. Usando um objeto que consome muitos recursos pode não ser uma opção de Design ideal, mas você pode controlar o ciclo de vida do objeto usando os eventos ObjectCreating, ObjectCreated, e ObjectDisposing.

Como já foi dito acima, uma grande aplicação web geralmente possui uma arquitetura dividida em diferentes camadas, sendo que o mais comum é usar 3 camadas:

  1. A camada de apresentação que contém as páginas web;
  2. A camada de Acesso a dados (DAL) a qual consiste de classes que servem como uma ponte entre as requisições da camada de apresentação e a camada de armazenamento de dados;
  3. A camada de armazenamento de dados , como um banco de dados SQL Server.

Assumindo que você tenha definido uma camada de acesso a dados (DAL) o controle ObjectDataSource pode ser usado para encapsular a informação retornada da DAL. Quando usar um controle ObjectDataSource você tera que fornecer duas informações:

  1. O nome completo qualificado da sua classe DAL que contém os métodos de acesso a dados;
  2. O nomes dos métodos para acessar , excluir, atualizar e inserir dados;

Usando o controle ObjectDataSource

Para demonstrar a utilização do controle ObjectDataSource vamos criar uma camada de acesso a dados (DAL) bem simples para interagir com o banco de dados Northwind.mdb.

Vamos acessar os dados da tabela Products cuja estrutura é exibida na figura a seguir:

A nossa  DAL é constituída de:

1-) uma classe Produtos que possui as seguintes propriedades:(Refletindo os campos da tabela Products)

2-) Uma classe  ProdutoDAL que contém um método estático chamado GetProdutos() e que retorna a lista de produtos. Vamos incluir o código da classe Produtos e da classe ProdutoDAL em um arquivo chamado DAL.vb que deverá ser colocado na pasta App_Code.

Vamos usar o Visual Web Developer 2005 Express Edition e criar um novo site web na opção File -> New Web Site com o nome de objectDataSourceNet

Na janela Solution Explorer clique com o botão direito do mouse sobre o nome do projeto e escolha Add New Item, e na janela a seguir selecione o template Class e informe o nome DAL.vb

Será apresentada uma janela solicitando a sua intervenção para colocar o arquivo a ser criado na basta App_Code da aplicação. Clique no botão Sim, desta forma garantimos que ele será compilado automaticamente e acessado pelas páginas da aplicação.

A seguir temos o código da classe Produtos e da classe  ProdutoDAL no arquivo DAL.vb;

Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports System.Collections.Generic

Public Class DAL

Public Class Product
   #Region "variaveis membros Privadas"
       Private _productID As Integer
        Private _productName As String
        Private _quantityPerUnit As String
        Private _unitPrice As Decimal
        Private _unitsInStock As Integer

   #End Region
   #Region "Construtores"
        Public Sub New()
        End Sub

        Public Sub New(ByVal productID As Integer, ByVal productName As String, ByVal quantityPerUnit As String, ByVal unitPrice As Decimal, ByVal unitsInStock As Integer)
              Me._productID = productID
              Me._productName = productName
              Me._quantityPerUnit = quantityPerUnit
              Me._unitPrice = unitPrice
              Me._unitsInStock = unitsInStock

        End Sub
    #End Region
    #Region "Public Properties"
        Public Property ProductID() As Integer
            Get
                Return _productID
            End Get
            Set(ByVal value As Integer)
                If value < 0 Then
                    Throw New ArgumentException("O valor de ProductID precisa ser maior ou igual a zero.")
                Else
                    _productID = value
                 End If
            End Set
         End Property
          Public Property ProductName() As String
             Get
                 Return _productName
             End Get
              Set(ByVal value As String)
                     _productName = value
              End Set
           End Property
         Public Property QuantityPerUnit() As String
             Get
                Return _quantityPerUnit
             End Get
              Set(ByVal value As String)
                  _quantityPerUnit = value
              End Set
          End Property
          Public Property UnitPrice() As Decimal
            Get
               Return _unitPrice
            End Get
            Set(ByVal value As Decimal)
               If value < 0 Then
                   Throw New ArgumentException("O valor de UnitPrice precisa ser maior ou igual a zero.")
              Else
                  _unitPrice = value
              End If
           End Set
         End Property
         Public Property UnitsInStock() As Integer
           Get
               Return _unitsInStock
           End Get
           Set(ByVal value As Integer)
               If value < 0 Then
                    Throw New ArgumentException("O valor de UnitsInStock precisa ser maior ou igual a zero.")
               Else
                  _unitsInStock = value
               End If
            End Set
        End Property
  #End Region
End Class

Public Class ProductDAL

  Public Shared Function GetProdutos() As List(Of Product)
   ' retorna uma lista de instâncias de Produtos baseado na tabela Product do banco de dados Northwind
     Dim sql As String = "SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock FROM Products"

     Dim myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("NWConnectionString").ConnectionString)
     Dim myCommand As New SqlCommand(sql, myConnection)

      myConnection.Open()

     Dim reader As SqlDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)
     Dim results As New List(Of Product)()

     While reader.Read()

         Dim product As New Product()

         product.ProductID = Convert.ToInt32(reader("ProductID"))
         product.ProductName = reader("ProductName").ToString()
         product.QuantityPerUnit = reader("QuantityPerUnit").ToString()

         If reader("UnitPrice").Equals(DBNull.Value) Then
               product.UnitPrice = 0
          Else
               product.UnitPrice = Convert.ToDecimal(reader("UnitPrice"))
          End If

         If reader("UnitsInStock").Equals(DBNull.Value) Then
               product.UnitsInStock = 0
          Else
               product.UnitsInStock = Convert.ToInt32(reader("UnitsInStock"))
          End If
          results.Add(product)
    End While

    reader.Close()
    myConnection.Close()

    Return results

   End Function
 End Class
End Class

No código acima o método GetProdutos retorna os campos relacionados da tabela Products do banco de dados Northwind.mdb e em seguida percorre (loop) o resultado obtido criando uma instância Product para cada um e incluindo a instância a uma Lista (List) de Produtos. Esta lista é então retornada no final do método.

A seguir a string de conexão usada :

"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\NORTHWND.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True"

Para exibir dados das classes DAL em páginas ASP.NET inclua um controle ObjectDataSource a página Default.aspx e clique na opção Configure Data Source na Smart tag - ObjectDataSource Tasks:

O assistente de configuração será iniciado. Selecione a opção contendo o objeto de negócio criado com a classe ProdutoDAL:

Na aba SELECT escolha o método indicado - GetProdutos e clique no botão Finish:

Inserindo um controle GridView no formulário e definindo o seu DataSource para o objectDataSource1 definido (poderíamos ter usando um nome mais pertinente para o objeto criado) já estamos prontos para exibir os dados da tabela Products na página web.

Efetuando uma formatação no GridView através da opção Auto Format... da GridView Tasks e executando o projeto iremos obter:

Como vemos através  do controle ObjectDataSource  podemos acessar a camada de dados através da DAL  usando os s métodos definidos,  no caso getProdutos.

Uma pergunta: Como fazemos para excluir dados e para editar dados de uma fonte de dados usando o ObjectDataSource ?

Criando os métodos para excluir e editar na classe ProdutoDAL , é claro. Vejamos como realizar esta tarefa...

Acompanhe o artigo ASP.NET 2.0 - ObjectDataSource : Incluindo e atualizando dados


José Carlos Macoratti