ASP .NET - Controles de fonte de dados e Caching


Realizar uma operação de vinculação de dados antes da versão 2.o do ASP .NET requeria escrever algum código que retornasse um DataSet ou DataReader que você deveria vincular a um controle de servidor como DataGrid, DropDownList, ListBox. Abaixo temos um exemplo básico do código para efetuar tal operação:

Dim conn As New SqlConnection()
Dim cmd As New SqlCommand("SELECT * FROM Customers", conn)
Dim da As New SqlDataAdapter(cmd)
Dim ds As New DataSet()
da.Fill(ds)
DataGrid1.DataSource = ds
DataGrid1.DataBind()
SqlConnection conn = new SqlConnection();
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
DataGrid1.DataSource = ds;
DataGrid1.DataBind();
VB .NET C#

A partir da ASP .NET 2.0 foi introduzido uma camada de abstração adicional através do uso dos controles de fonte de dados (data source controls). A figura abaixo mostra como estes controles abstraem o uso de um provedor de dados correspondente como um SQL Data Provider ou OLE DB Data Provider.

Dessa forma você não precisa se preocupar em como ou porque usar os provedores de dados, ao invés, os controles de fonte de dados fazem todo o trabalho pesado para você, basta a você somente saber onde estão os seus dados, e, se for preciso, saber também como construir uma consulta para realizar as operações de manutenção (CRUD).

Como todos os controles de fonte de dados derivam da classe Control , você pode usá-los para controlar o comportamento de um controle de fonte de dados de forma declarativa no seu HTML ou via código; isto significa que você pode realizar todo o tipo de acesso a dados para manipulação sem ter que escrever uma única linha de código usando apenas os assistentes do Visual Studio.

Atualmente existem 6 controles de fonte de dados no ASP .NET 3.5 que são usados para um tipo específico de acesso a dados. Abaixo temos uma breve descrição de cada um deles:

Controle Descrição
SqlDataSource Fornece acesso a qualquer fonte de dados que possui um provedor ADO .NET disponível;por padrão possui acesso aos provedores ODBC, OLE DB, SQL Server, Oracle e SQL Server CE;
LinqDataSource Fornece acesso a diferentes tipos de dados de objetos usando consultas LINQ;
ObjectDataSource Fornece acesso a dados especializado a objetos de negócios ou outra classes que retornam dados;
XmlDataSource Fornece acesso a dados especializado a documentos XML fisicamente ou em memória;
SiteMapDataSource Fornece acesso a dados site map para um web site que esta armazenado pelo provedor site map;
AccessDataSource Fornece acesso a dados especializado a banco de dados Access;

Nota: Veja um exemplo de utilização de cada um destes controles nas referências deste artigo.

Usando o Caching com os controles de acesso a dados

O recurso de cache esta presente em todos os controles de fontes de dados com exceção do controle SiteMapDataSource. Dessa forma você pode configurar e controlar a utilização do cache de dados de forma bem simples usando a mesma sintaxe declarativa.

Obs: Usar o cache de dados significa armazenar os dados em memória de forma que o acesso aos dados seja feita de forma mais rápida.

Todos os controles permitem que você crie politicas de cache básicas incluindo a direção do cache, politica de expiração e dependência de chaves.

Lembre-se que as características de cache para o controle SqlDataSource estão disponíveis somente se você definir a propriedade DataSourceMode como DataSet. Se ela for definida como DataReader o controle irá lançar a exceção NotSupportedException

A duração do cache pode ser definida para um valor específico de tempo como 60 minutos (3600 segundos) ou você pode definir o tempo como infinito para forçar que o cache dos dados nunca expire. O trecho de código abaixo mostra como você pode usar os recursos do cache para um controle de acesso a dados, no caso o controle SqlDataSource:

<asp:SqlDataSource ID="SqlDataSource1" Runat="server"
       SelectCommand="SELECT * FROM [Clientes]"
       ConnectionString="<%$ ConnectionStrings:AppConnectionString1 %>"
       DataSourceMode="DataSet"
       ConflictDetection="CompareAllValues"
       EnableCaching="True" CacheKeyDependency="suaChave" CacheDuration="Infinite">
       <SelectParameters>
              <asp:QueryStringParameter Name="ClienteID"
                      QueryStringField="id" Type="String"></asp:QueryStringParameter>
       </SelectParameters>
</asp:SqlDataSource

Obs: Você pode definir a propriedade CacheKeyDependency para criar uma dependência entre todas as entradas de cache que são criadas pelo Controle SqlDataSource e a chave.

Existem também o Output Cache onde todo o conteúdo da página pode ser armazenado no cache. Neste caso geralmente se armazena no cache as páginas mais acessadas para obter um ganho de desempenho ou evitar que o servidor fique muito lento no atendimento as requisições. Uma página que é colocada no OutputCache é acessada diretamente no cache sem a necessidade de execução do código que a gerou.

Podemos ativar o cache de sáida (OutPutCache) de duas formas:

         ' Uso do cache de saída no servidor
        
   Response.Cache.SetCacheability(HttpCacheability.Server)
        
 ' A página sera válida por vinte segundos no cache
     
     Response.Cache.SetExpires(DateTime.Now.AddSeconds(20))

        <%@ OutputCache Duration="120" VaryByParam="None" %>

- O atributo Duration determina o tempo em segundos que a página será armazeanda no cache;
- O atributo VaryByParam permite que sejam adicionadas múltiplas páginas no cache, de acordo com um parâmetro da QueryString. O atributo VaryByParam=None indica que a página não muda de acordo com nenhum parâmetro GET ou POST;

Esta pequena revisão de conceitos é apenas para lembrá-lo que você também pode usar o cache com os controles de dados.

Eu sei é apenas ASP .NET, mas eu gosto...

Referências:


José Carlos Macoratti