ASP.NET - Os novos Controles para acesso a dados


 

Os controles para fonte de dados fornecem uma forma declarativa de definir além da conexão com a fonte de dados também os comandos usados para gerenciar os dados. Alguns controles não interagem diretamente com a sua fonte de dados mas interagem na forma de um provedor. Um provedor abstrai a funcionalidade de tratar com uma fonte de dados e fornece uma API e controles consistentes para serem usados em aplicações.

 

Na ASP.NET 2.0 temos os seguintes controles para fonte de dados fornecidos como padrão:

Por uma questão de tempo e espaço vou tratar neste artigo somente do controle SQLDataSource. Os testes e os códigos de exemplo exibidos utilizarão a tabela Produtos da base de dados Cadastro.mdf criada no SQL Server 2005. Os dados e a estrutura da tabela Produtos é exibida  a seguir:

A string de conexão usada para os exemplos deste artigo foi configurada no arquivo web.config da seguinte forma: (Lembre-se que para o seu ambiente a string de conexão é diferente)

<connectionStrings>
<
add name="CadastroConnectionString" connectionString="Data Source=MACORATI\SQLEXPRESS;AttachDbFilename='D:\Documents and Settings\Macoratti.MACORATI\Meus documentos\Cadastro.mdf';Integrated Security=True"
 
providerName="System.Data.SqlClient"/>
</
connectionStrings>

O controle para fonte de dados SqlDataSource

O controle SqlDataSource fornece um modelo em duas camadas para interagir com banco de dados relacionais. Ele abstrai a necessidade do desenvolvedor declarar explicitamente conexões e comandos deixando-o livre para se concentrar no foco do seus dados.

Para configurar um controle SqlDataSource você pode manualmente editar as propriedades ou usar o assistente com a opção Configure Data Source.

O controle SqlDataSource possui um algumas propriedades que regem o seu comportamento. A primeira é a propriedade DataSourceMode que pode ser definida ou para DataSet ou para DataReader, para identificar como os dados serão tratados a partir da fonte de dados. O padrão é DataSet que permite a atualização enquanto que DataReader fornece um melhor desempenho mas permite somente o acesso de somente leitura aos dados.

Exibindo dados com o controle GridView

Para exibir dados em um controle GridView o controle SqlDataSource requer somente que duas propriedades sejam definidas : ConnectionString e SelectCommand. Vejamos um exemplo :

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
  ConnectionString="<%$ ConnectionStrings:CadastroConnectString %>"
  SelectCommand="SELECT * FROM Produtos" />

Com  estas linhas de códigos estamos obtendo todos os dados da tabela Produto .Se desejar usar uma stored procedure você deve substituir a instrução SQL pelo nome da stored procedure e incluir o atributo SelectCommandType definindo o seu valor como StoredProcedure. O exemplo ficaria assim:

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
  ConnectionString="<%$ ConnectionStrings:CadastroConnectString %>"
  SelectCommand="sp_Produtos"
  SelectCommandType="StoredProcedure" />

Definido a conexão a fonte de dados você pode usar este controle de fonte de dados para ser vinculado a qualquer outro controle como um GridView, neste caso o código ficaria assim:

<asp:GridView ID="GridView1" runat="server"   DataSourceID="SqlDataSource1" />

No código estou usando a propriedade DataSourceID para identificar a propriedade ID do controle da fonte de dados. O padrão é o GridView exibir todas as colunas da fonte de dados mas você pode inibir este comportamento definindo a propriedade Auto-GenerateColumns como False e definindo as colunas que deseja exibir na sua instrução SQL ou stored procedure.

Usando o Visual Web Developer - VWD, crie um novo Web Site chamado sqlDataSource, e, na página default.aspx criada , estando no modo Source , inclua o código conforme abaixo:

 

Se você mudar para o modo Design verá que foi criado um DataGridView e um SqlDataSource:
 

 

Ao executar a página acima, clicando no botão start debugging,  ano servidor do VWD o resultado exibido será:

 

 

Nota: Você pode obter o mesmo resultado arrastando a tabela Produtos da janela DataBaseExplorer para o     descritor no modo Design.


Filtrando e Selecionado Dados

Uma das grandes características dos novos controles de dados é suportar as consultas parametrizadas permitindo assim que você filtre dados dependendo de um critério externo. Você pode filtrar dados da fonte de dados usando SelectParameters ou na página web depois dos dados terem sido selecionados usando FilterParameters.

A diferença e que SelectParameters e a cláusula WHERE são aplicados antes de os dados serem selecionados enquanto que FilterParameters seleciona os dados e então efetua a filtragem dos mesmos. Estas ações não são mutuamente exclusivas e ambas podem ser realizadas se necessário.  A seleção é útil se o conjunto de dados a serem encontrados é grande , pois somente um subconjunto dos dados é retornado da fonte de dados para a página. A filtragem é útil quando os dados são armazenados em cache, pois isto reduz a sobrecarga no banco de dados.

Existem sete fontes de dados que podem se aplicados para selecionar e filtrar

Podemos notara a grande flexibilidade para filtrar dados de uma maneira declarativa. Vejamos a seguir as propriedades comuns a todos estes parâmetros :

Propriedade Descrição
ConvertEmptyStringToNull Indica se um valor vazio será convertido ou não para NULL antes de ser passado para o SQL Server.
DefaultValue Indica o valor padrão do parâmetro, se ele não for fornecido pela fonte externa
Direction Indica a direção do fluxo de dados e pode ter um dos seguintes valores:
  • Input, para dados transferidos para o SQL Server

  • InputOutput, para dados transferidos para e a partir do SQLServer

  • Output,  para dados transferidos a partir do SQL Server

  • ReturnValue, para dados transferidos do  com o valor de retorno de uma consulta.

Name O nome do parâmetro
Size O tamanho do parâmetro.
Type O tipo de dados do parâmetro. Pode ser : Boolean, Byte, Char, DateTime, DBNull, Decimal, Double, Empty, Int16,Int32, Int64, Object, SByte, Single, String, UInt16,UInt32, UInt64.

Além destas propriedades cada tipo de parâmetro possui suas propriedades específicas, conforme abaixo:

Parâmetro

Propriedade

Descrição

ControlParameter

ControlID

O ID do controle fornecendo o parâmetro dados

 

PropertyName

O nome da propriedade do controle. Ex: propriedade Text.

CookieParameter

CookieName

O nome do cookie fornecendo o parâmetro dados.

FormField

FormParameter

O nome do campo de formulário fornecendo o parâmetro dados.

ProfileProperty

PropertyName

O nome do da propriedade Profile fornecendo o parâmetro dados

QueryString Parameter

QueryString Field

O nome do campo query string fornecendo o parâmetro dados

Session Parameter

SessionField

O nome do campo de sessão fornecendo o parâmetro dados

Todas estes parâmetros trabalham da mesma forma. Os dados a serem usados na seleção ou filtragem é obtido a partir da localização especificada pelo parâmetro. Assim para o parâmetro ControlParameter, o ID identifica o controle e PropertyName identifica a propriedade que armazena os dados.

Se um controle TextBox for usado como fonte de dados do parâmetro, a propriedade Text será usada como PropertyName. Um controle GridView pode usar a propriedade SelectedValue como PropertyName que usará o campo chave (da propriedade DataKeyNames) para o valor do parâmetro.

Você pode configurar parâmetros usando os assistentes, declarativamente  (na fonte gerada pelo assistente) ou no seu próprio código.

Selecionando dados Declarativamente

Para selecionar dados , você usa a propriedade SelectParameters da fonte de dados como mostrado no código a seguir:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:TesteConnectString %>"
  SelectCommand="SELECT * FROM [Produtos] WHERE ([NomeProduto] LIKE '%' + @NomeProduto + '%')">
  <SelectParameters>
      <asp:ControlParameter Name="NomeProduto" Type="String" ControlID="TextBox1" PropertyName="Text" />
  </SelectParameters>
</asp:SqlDataSource>

O código mostra o resultado obtido usando um assistente na configuração de um SqlDataSource . O comando selecionado possui a cláusula Where incluída. Note que o parâmetro na cláusula Where é tratado como um parâmetro SQL Server pois possui o caractere @. A propriedade Name de  ControlParameter  é igual a nome do parâmetro na consulta. Você pode usar qualquer valor para o nome do parâmetro, mas ele precisa ser igual ao parâmetro atual e manter o mesmo nome da coluna para facilitar a leitura.

No exemplo de código a seguir temos a inclusão de parâmetros adicionais:

<asp:SqlDataSource ID="SqlDataSource1" runat="server"  ConnectionString="<%$ ConnectionStrings:CadastroConnectString %>"
  SelectCommand="SELECT * FROM [Produtos] WHERE  ([NomeProduto] LIKE '%' + @NomeProduto + '%')
                           AND Preco < @Preco  AND Discontinuado= @Discontinuado">
  <SelectParameters>
    <asp:ControlParameter Name="NomeProduto" Type="String"  ControlID="TextBox1" PropertyName="Text" />
    <asp:ControlParameter Name="Preco" Type="Decimal"  ControlID="ListaPrecot" PropertyName="SelectedValue" />
    <asp:QueryStringParameter Name="Discontinuado" Type="Boolean"  QueryStringField="Discontinuado" />
  </SelectParameters>
</asp:SqlDataSource>

Neste exemplo temos 3 parâmetros. O primeiro já foi mencionado, o segundo seleciona somente linhas onde o Preco é menor que um certo valor (Preco < @Preco) e o terceiro seleciona a coluna Discontinuado. O SelectCommand  ainda segue o formato padrão SQL, mas casa parâmetro possui uma entrada em SelectParameters.

Os dois primeiros parâmetros recebem o seu valor dos controles; o primeiro da propriedade Text do controle TextBox e o segundo da propriedade SelectedValue da Lista. O terceiro parâmetro toma o seu valor da propriedade QueryString, mostrando que você pode misturar diferentes tipos de parâmetros na mesma consulta.

O processo de filtrar dados é um pouco diferente, nele temos que o SelectCommand não é modificado mas a propriedade FilterExpression é incluida e e FilterParameters é usado no lugar de SelectParameters como mostrado no trecho de código a seguir:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:CadastroConnectString %>"
  SelectCommand="SELECT * FROM [Produto]"   FilterExpression="NomeProduto LIKE '{0}%'">
  <FilterParameters>
    <asp:ControlParameter Name="NomeProduto" Type="String" ControlID="TextBox1" PropertyName="Text" />
  </FilterParameters>
</asp:SqlDataSource>

Perceba que os parâmetros usados em FilterExpression não são nomeados explicitamente eles são posicionais. Desta forma {0} refere-se ao primeiro parâmetro em FilterParameters; se houver parâmetros subseqüentes eles serão identificados por {1} , {2} e assim por diante...

Quando usados declarativamente , a filtragem e a seleção não precisam de código, e fornecem uma maneira simples de vincular controles de dados vinculados a outros controles ou outras fontes de dados. Você não pode filtrar ou selecionar diretamente a partir do seu código , embora existam eventos que permitam a você modificar valores de parâmetros antes de uma ação ser executada. O controle SqlDataSource possui um método Select mas este somente opera na ordenação e na paginação

Com esta pequena introdução sobre os conceitos básicos sobre o SqlDataSource pretendi mostrar aspectos básicos mas importantes para o desenvolvimento de páginas usando ASP.NET 2.0 com acesso a dados.

Até breve...


José Carlos Macoratti