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:
ObjectDataSource, interage com classes personalizadas
SiteMapDataSource, interage com mapa de dados para navegação.
SqlDataSource, interage com banco de dados SQL
XmlDataSource, interage com arquivos XML
<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 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.
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.
ControlParameter, Obtém os dados de um controle de servidor ASP.NET
CookieParameter, Obtém os dados de um Cookie
FormParameter, Obtém dados de um controle HTML de formulário
Parameter, É a classe base para outros parâmetros e não possui uma fonte de dados padrão.
ProfileParameter, Obtém os dados de uma propriedade Profile
QueryStringParameter, Obtém dados de um consulta string.
SessionParameter, Obtém os dados de uma sessão.
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:
|
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.
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