Consultar dados com o controle SqlDataSource (VB)
por Scott Mitchell
Nos tutoriais anteriores, usamos o controle ObjectDataSource para separar totalmente a camada de apresentação da camada de Acesso a Dados. Começando com este tutorial, aprendemos como o controle SqlDataSource pode ser usado para aplicativos simples que não exigem uma separação tão estrita de apresentação e acesso a dados.
Introdução
Todos os tutoriais que examinamos até agora usaram uma arquitetura em camadas que consiste em camadas de apresentação, lógica de negócios e acesso a dados. A Camada de Acesso a Dados (DAL) foi criada no primeiro tutorial (Criando uma Camada de Acesso a Dados) e a Camada de Lógica de Negócios no segundo (Criando uma Camada de Lógica de Negócios). Começando com o tutorial Exibindo dados com o ObjectDataSource , vimos como usar ASP.NET novo controle ObjectDataSource do 2.0 para fazer interface declarativamente com a arquitetura da camada de apresentação.
Embora todos os tutoriais até agora tenham usado a arquitetura para trabalhar com dados, também é possível acessar, inserir, atualizar e excluir dados de banco de dados diretamente de uma página ASP.NET, ignorando a arquitetura. Isso coloca as consultas de banco de dados específicas e a lógica de negócios diretamente na página da Web. Para aplicativos suficientemente grandes ou complexos, projetar, implementar e usar uma arquitetura hierárquica é de vital importância para o sucesso, a capacidade de atualização e a capacidade de manutenção do aplicativo. O desenvolvimento de uma arquitetura robusta, no entanto, pode ser desnecessário ao criar aplicativos extremamente simples e únicos.
ASP.NET 2.0 fornece cinco controles de fonte de dados internos SqlDataSource, AccessDataSource, ObjectDataSource, XmlDataSource e SiteMapDataSource. O SqlDataSource pode ser usado para acessar e modificar dados diretamente de um banco de dados relacional, incluindo Microsoft SQL Server, Microsoft Access, Oracle, MySQL e outros. Neste tutorial e nos próximos três, examinaremos como trabalhar com o controle SqlDataSource, explorando como consultar e filtrar dados de banco de dados, bem como usar o SqlDataSource para inserir, atualizar e excluir dados.
Figura 1: ASP.NET 2.0 inclui cinco controles de fonte de dados internos
Comparando o ObjectDataSource e o SqlDataSource
Conceitualmente, os controles ObjectDataSource e SqlDataSource são simplesmente proxies para dados. Conforme discutido no tutorial Exibindo dados com o ObjectDataSource , o ObjectDataSource tem propriedades que indicam o tipo de objeto que fornece os dados e os métodos a serem invocados para selecionar, inserir, atualizar e excluir dados do tipo de objeto subjacente. Depois que as propriedades do ObjectDataSource forem configuradas, um controle Web de dados, como um GridView, DetailsView ou DataList, poderá ser associado ao controle, usando os métodos ObjectDataSource , Select()
Insert()
, Delete()
e Update()
para interagir com a arquitetura subjacente.
O SqlDataSource fornece a mesma funcionalidade, mas opera em um banco de dados relacional em vez de uma biblioteca de objetos. Com o SqlDataSource, devemos especificar a cadeia de conexão do banco de dados e as consultas SQL ad hoc ou procedimentos armazenados a serem executados para inserir, atualizar, excluir e recuperar dados. Os métodos , , , Update()
e Delete()
do SqlDataSourceSelect()
Insert()
, quando invocados, conectam-se ao banco de dados especificado e emitem a consulta SQL apropriada. Como ilustra o diagrama a seguir, esses métodos fazem o trabalho pesado de se conectar a um banco de dados, emitir uma consulta e retornar os resultados.
Figura 2: O SqlDataSource serve como um proxy para o banco de dados
Observação
Neste tutorial, vamos nos concentrar na recuperação de dados do banco de dados. No tutorial Inserindo, atualizando e excluindo dados com o controle SqlDataSource, veremos como configurar o SqlDataSource para dar suporte à inserção, atualização e exclusão.
Os controles SqlDataSource e AccessDataSource
Além do controle SqlDataSource, o ASP.NET 2.0 também inclui um controle AccessDataSource. Esses dois controles diferentes levam muitos desenvolvedores novos no ASP.NET 2.0 a suspeitar que o controle AccessDataSource foi projetado para funcionar exclusivamente com o Microsoft Access com o controle SqlDataSource projetado para funcionar exclusivamente com o Microsoft SQL Server. Embora o AccessDataSource tenha sido projetado para funcionar especificamente com o Microsoft Access, o controle SqlDataSource funciona com qualquer banco de dados relacional que possa ser acessado por meio do .NET. Isso inclui quaisquer armazenamentos de dados compatíveis com OleDB ou ODBC, como Microsoft SQL Server, Microsoft Access, Oracle, Informix, MySQL e PostgreSQL, entre muitos outros.
A única diferença entre os controles AccessDataSource e SqlDataSource é como as informações de conexão do banco de dados são especificadas. O controle AccessDataSource precisa apenas do caminho do arquivo para o arquivo de banco de dados do Access. O SqlDataSource, por outro lado, requer uma cadeia de conexão completa.
Etapa 1: Criando as páginas da Web SqlDataSource
Antes de começarmos a explorar como trabalhar diretamente com dados de banco de dados usando o controle SqlDataSource, vamos primeiro dedicar um momento para criar as páginas ASP.NET em nosso projeto de site que precisaremos para este tutorial e os próximos três. Comece adicionando uma nova pasta chamada SqlDataSource
. Em seguida, adicione as seguintes páginas ASP.NET a essa pasta, certificando-se de associar cada página à Site.master
página mestra:
Default.aspx
Querying.aspx
ParameterizedQueries.aspx
InsertUpdateDelete.aspx
OptimisticConcurrency.aspx
Figura 3: Adicionar as páginas ASP.NET para os tutoriais relacionados ao SqlDataSource
Como nas outras pastas, Default.aspx
na SqlDataSource
pasta listará os tutoriais em sua seção. Lembre-se de que o SectionLevelTutorialListing.ascx
Controle de Usuário fornece essa funcionalidade. Portanto, adicione esse Controle de Usuário arrastando-o Default.aspx
do Gerenciador de Soluções para o modo de exibição Design da página.
Figura 4: Adicionar o controle de usuário a Default.aspx
(clique para exibir a SectionLevelTutorialListing.ascx
imagem em tamanho real)
Por fim, adicione essas quatro páginas como entradas ao Web.sitemap
arquivo. Especificamente, adicione a seguinte marcação após Adicionando botões personalizados à lista de dados e ao repetidor <siteMapNode>
:
<siteMapNode url="~/SqlDataSource/Default.aspx"
title="Using the SqlDataSource Control"
description="Work directly with database data using the SqlDataSource control.">
<siteMapNode url="~/SqlDataSource/Querying.aspx" title="Retrieving Database Data"
description="Examines how to query data from a database that can then be
displayed through a data Web control."/>
<siteMapNode url="~/SqlDataSource/ParameterizedQueries.aspx"
title="Parameterized Queries"
description="Learn how to specify parameterized WHERE clauses in the
SqlDataSource's SELECT statement." />
<siteMapNode url="~/SqlDataSource/InsertUpdateDelete.aspx"
title="Inserting, Updating, and Deleting Database Data"
description="See how to configure the SqlDataSource to include INSERT, UPDATE,
and DELETE statements." />
<siteMapNode url="~/SqlDataSource/OptimisticConcurrency.aspx"
title="Using Optimistic Concurrency"
description="Explore how to augment the SqlDataSource to include support for
optimistic concurrency." />
</siteMapNode>
Após a atualização Web.sitemap
, reserve um momento para visualizar o site de tutoriais por meio de um navegador. O menu à esquerda agora inclui itens para os tutoriais de edição, inserção e exclusão.
Figura 5: O mapa do site agora inclui entradas para os tutoriais do SqlDataSource
Etapa 2: Adicionando e configurando o controle SqlDataSource
Comece abrindo a Querying.aspx
página na pasta e alterne para o SqlDataSource
modo Design. Arraste um controle SqlDataSource da Caixa de Ferramentas para o Designer e defina seu ID
arquivo como ProductsDataSource
. Assim como acontece com o ObjectDataSource, o SqlDataSource não produz nenhuma saída renderizada e, portanto, aparece como uma caixa cinza na superfície de design. Para configurar o SqlDataSource, clique no link Configurar Fonte de Dados da marca inteligente do SqlDataSource.
Figura 6: Clique no link Configurar fonte de dados da marca inteligente do SqlDataSource
Isso abre o assistente Configurar Fonte de Dados do controle SqlDataSource. Embora as etapas do assistente sejam diferentes do controle ObjectDataSource, a meta final é a mesma para fornecer os detalhes sobre como recuperar, inserir, atualizar e excluir dados por meio da fonte de dados. Para o SqlDataSource, isso implica especificar o banco de dados subjacente a ser usado e fornecer as instruções SQL ad hoc ou procedimentos armazenados.
A primeira etapa do assistente nos solicita o banco de dados. A lista suspensa inclui os bancos de dados encontrados na pasta do App_Data
aplicativo Web e aqueles que foram adicionados ao nó Conexões de Dados no Gerenciador de Servidores. Como já adicionamos uma cadeia de conexão para o NORTHWIND.MDF
banco de dados na App_Data
pasta ao arquivo do Web.config
projeto, a lista suspensa inclui uma referência a essa cadeia de conexão, NORTHWINDConnectionString
. Escolha este item na lista suspensa e clique em Avançar.
Figura 7: Escolha o NORTHWINDConnectionString
na lista suspensa
Depois de escolher o banco de dados, o assistente solicita que a consulta retorne dados. Podemos especificar as colunas de uma tabela ou exibição a serem retornadas ou podemos inserir uma instrução SQL personalizada ou especificar um procedimento armazenado. Você pode alternar entre essa opção por meio dos botões de opção Especificar uma instrução SQL personalizada ou procedimento armazenado e Especificar colunas de uma tabela ou exibição.
Observação
Para este primeiro exemplo, vamos usar a opção Especificar colunas de uma tabela ou exibição. Voltaremos ao assistente mais adiante neste tutorial e exploraremos a opção Especificar uma instrução SQL personalizada ou um procedimento armazenado.
A Figura 8 mostra a tela Configurar a instrução Select quando o botão de opção Specify columns from a table or view é selecionado. A lista suspensa contém o conjunto de tabelas e exibições no banco de dados Northwind, com a tabela selecionada ou as colunas da exibição exibidas na lista de caixas de seleção abaixo. Para este exemplo, vamos retornar as ProductID
colunas Products
, ProductName
e UnitPrice
da tabela. Como mostra a Figura 8, depois de fazer essas seleções, o assistente mostra a instrução SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]
SQL resultante.
Figura 8: Retornar dados da Products
tabela
Depois de Products
configurar o assistente para retornar as ProductID
colunas , ProductName
e UnitPrice
da tabela, clique no botão Avançar. Essa tela final oferece uma oportunidade de examinar os resultados da consulta configurada na etapa anterior. Clicar no botão Testar Consulta executa a instrução configurada SELECT
e exibe os resultados em uma grade.
Figura 9: Clique no botão Testar consulta para revisar sua SELECT
consulta
Para concluir o assistente, clique em Concluir.
Assim como acontece com o ObjectDataSource, o assistente do SqlDataSource apenas atribui valores às propriedades do controle, ou seja, as ConnectionString
propriedades e SelectCommand
. Depois de concluir o assistente, a marcação declarativa do controle SqlDataSource deve ser semelhante à seguinte:
<asp:SqlDataSource ID="ProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]">
</asp:SqlDataSource>
A ConnectionString
propriedade fornece informações sobre como se conectar ao banco de dados. Essa propriedade pode ser atribuída a um valor de cadeia de conexão completo e codificado ou pode apontar para uma cadeia de conexão em Web.config
. Para fazer referência a um valor de cadeia de conexão em Web.config, use a sintaxe <%$ expressionPrefix:expressionValue %>
. Normalmente, expressionPrefix é ConnectionStrings e expressionValue é o nome da cadeia de conexão na<connectionStrings>
Web.config
seção. No entanto, a sintaxe pode ser usada para fazer referência <appSettings>
a elementos ou conteúdo de arquivos de recurso. Consulte ASP.NET Visão geral de expressões para obter mais informações sobre essa sintaxe.
A SelectCommand
propriedade especifica a instrução SQL ad hoc ou o procedimento armazenado a ser executado para retornar os dados.
Etapa 3: Adicionando um controle Web de dados e associando-o ao SqlDataSource
Depois que o SqlDataSource tiver sido configurado, ele poderá ser associado a um controle Web de dados, como um GridView ou DetailsView. Para este tutorial, vamos exibir os dados em um GridView. Na Caixa de Ferramentas, arraste um GridView para a página e associe-o ao ProductsDataSource
SqlDataSource escolhendo a fonte de dados na lista suspensa na marca inteligente do GridView.
Figura 10: Adicionar um GridView e associá-lo ao controle SqlDataSource (clique para exibir a imagem em tamanho completo)
Depois de selecionar o controle SqlDataSource na lista suspensa na marca inteligente do GridView, o Visual Studio adicionará automaticamente um BoundField ou CheckBoxField ao GridView para cada uma das colunas retornadas pelo controle da fonte de dados. Como o SqlDataSource retorna três colunas ProductID
de banco de dados , ProductName
e UnitPrice
há três campos no GridView.
Reserve um momento para configurar os três BoundFields do GridView. Altere a ProductName
propriedade do HeaderText
campo para Nome do Produto e o UnitPrice
campo para Preço. Formate também o UnitPrice
campo como uma moeda. Depois de fazer essas modificações, a marcação declarativa do GridView deve ser semelhante à seguinte:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ProductID"
InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
<asp:BoundField DataField="ProductName" HeaderText="Product Name"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Price"
SortExpression="UnitPrice" DataFormatString="{0:c}"
HtmlEncode="False" />
</Columns>
</asp:GridView>
Visite esta página através de um navegador. Como mostra a Figura 11, o GridView lista os valores de ProductID
ProductName
, , e UnitPrice
de cada produto.
Figura 11: O GridView exibe os valores de ProductID
ProductName
, e UnitPrice
de cada produto (clique para exibir a imagem em tamanho real)
Quando a página é visitada, o GridView invoca seu método do controle da fonte de Select()
dados. Quando estávamos usando o controle ObjectDataSource, isso chamou o ProductsBLL
método da GetProducts()
classe. Com o SqlDataSource, no entanto, o Select()
método estabelece uma conexão com o banco de dados especificado e emite o SelectCommand
(SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]
, neste exemplo). O SqlDataSource retorna seus resultados que o GridView enumera, criando uma linha no GridView para cada registro de banco de dados retornado.
Os recursos internos de controle da Web de dados e o controle SqlDataSource
Em geral, os recursos inerentes aos controles Web de dados paginação, classificação, edição, exclusão, inserção e assim por diante são específicos do controle Web de dados e não dependem do controle da fonte de dados usado. Ou seja, o GridView pode utilizar sua paginação, classificação, edição e exclusão internas, independentemente de estar associado a um ObjectDataSource ou a um SqlDataSource. No entanto, determinados recursos de controle da Web de dados são sensíveis ao controle da fonte de dados que está sendo usado ou à configuração do controle da fonte de dados.
Por exemplo, no tutorial Paginação eficiente por meio de grandes quantidades de dados , discutimos como, por padrão, a lógica de paginação para os controles da Web de dados retorna ingenuamente todos os registros da fonte de dados subjacente e, em seguida, exibe apenas o subconjunto apropriado de registros, considerando o índice de página atual e o número de registros a serem exibidos por página. Esse modelo é altamente ineficiente ao paginar conjuntos de resultados suficientemente grandes. Felizmente, o ObjectDataSource pode ser configurado para dar suporte à paginação personalizada, que retorna apenas o subconjunto preciso de registros a serem exibidos. O controle SqlDataSource, no entanto, não tem as propriedades para implementar a paginação personalizada.
Outra sutileza com paginação e classificação surge com o SqlDataSource. Por padrão, os dados retornados de um SqlDataSource podem ser paginados ou classificados por meio do GridView. Para demonstrar isso, verifique as opções Habilitar Paginação e Habilitar Classificação na marca inteligente do GridView e Querying.aspx
verifique se isso funciona conforme o esperado.
A classificação e a paginação funcionam porque o SqlDataSource recupera os dados do banco de dados em um DataSet de tipo flexível. O número total de registros retornados pela consulta, um aspecto essencial para a implementação da paginação, pode ser verificado no DataSet. Além disso, os resultados do DataSet podem ser classificados por meio de um DataView. Esses recursos são usados automaticamente pelo SqlDataSource quando o GridView solicita dados paginados ou classificados.
O SqlDataSource pode ser configurado para retornar um DataReader em vez de um DataSet alterando sua DataSourceMode
propriedade de DataSet
(o padrão) para DataReader
. Usar um DataReader pode ser preferível em situações ao passar os resultados do SqlDataSource para o código existente que espera um DataReader. Além disso, como os DataReaders são objetos consideravelmente mais simples do que os DataSets, eles oferecem melhor desempenho. No entanto, se você fizer essa alteração, o controle Web de dados não poderá classificar nem paginar, pois o SqlDataSource não pode verificar quantos registros são retornados pela consulta, nem o DataReader oferece nenhuma técnica para classificar os dados retornados.
Etapa 4: Usando uma instrução SQL personalizada ou um procedimento armazenado
Ao configurar o controle SqlDataSource, a consulta usada para retornar dados pode ser especificada em uma das duas abordagens como uma instrução SQL personalizada ou procedimento armazenado, ou como colunas de uma tabela ou exibição existente. Na Etapa 2, examinamos a seleção de colunas da Products
tabela. Vejamos o uso de uma instrução SQL personalizada.
Adicione outro controle GridView à Querying.aspx
página e opte por criar uma nova fonte de dados na lista suspensa na marca inteligente. Em seguida, indique que os dados serão extraídos de um banco de dados, isso criará um novo controle SqlDataSource. Nomeie o controle ProductsWithCategoryInfoDataSource
.
Figura 12: Criar um novo controle SqlDataSource chamado ProductsWithCategoryInfoDataSource
A próxima tela nos pede para especificar o banco de dados. Como fizemos na Figura 7, selecione na NORTHWINDConnectionString
lista suspensa e clique em Next. Na tela Configurar a instrução Select, escolha o botão de opção Especificar uma instrução SQL personalizada ou um procedimento armazenado e clique em Avançar. Isso abrirá a tela Definir instruções personalizadas ou procedimentos armazenados, que oferece guias rotuladas SELECT, UPDATE, INSERT e DELETE. Em cada guia, você pode inserir uma instrução SQL personalizada na caixa de texto ou escolher um procedimento armazenado na lista suspensa. Neste tutorial, veremos como inserir uma instrução SQL personalizada; O próximo tutorial inclui um exemplo que usa um procedimento armazenado.
Figura 13: Inserir uma instrução SQL personalizada ou escolher um procedimento armazenado
A instrução SQL personalizada pode ser inserida manualmente na caixa de texto ou pode ser construída graficamente clicando no botão Construtor de Consultas. No Construtor de Consultas ou na caixa de texto, use a seguinte consulta para retornar os ProductID
campos and ProductName
da Products
tabela usando a JOIN
para recuperar o produto da CategoryName
Categories
tabela:
SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Categories
INNER JOIN Products ON
Categories.CategoryID = Products.CategoryID
Figura 14: Você pode construir graficamente a consulta usando o Construtor de Consultas
Depois de especificar a consulta, clique em Avançar para prosseguir para a tela Testar consulta. Clique em Concluir para concluir o assistente SqlDataSource.
Depois de concluir o assistente, o GridView terá três BoundFields adicionados a ele exibindo as ProductID
colunas , ProductName
e CategoryName
e retornadas da consulta e resultando na seguinte marcação declarativa:
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsWithCategoryInfoDataSource"
EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ProductID"
InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
<asp:BoundField DataField="ProductName" HeaderText="ProductName"
SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName" HeaderText="CategoryName"
SortExpression="CategoryName" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="ProductsWithCategoryInfoDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand="
SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Categories
INNER JOIN Products ON Categories.CategoryID = Products.CategoryID">
</asp:SqlDataSource>
Figura 15: O GridView mostra a ID, o nome e o nome da categoria associada a cada produto (clique para exibir a imagem em tamanho real)
Resumo
Neste tutorial, vimos como consultar e exibir dados usando o controle SqlDataSource. Como o ObjectDataSource, o SqlDataSource serve como um proxy, fornecendo uma abordagem declarativa para acessar dados. Suas propriedades especificam o banco de dados ao qual se conectar e a consulta SQL SELECT
a ser executada; elas podem ser especificadas por meio da janela Propriedades ou usando o assistente Configurar Fonte de Dados.
Os SELECT
exemplos de consulta que examinamos neste tutorial retornaram todos os registros da consulta especificada. O controle SqlDataSource, no entanto, pode incluir uma WHERE
cláusula com parâmetros cujos valores são atribuídos programaticamente ou são extraídos automaticamente de uma fonte especificada. Examinaremos como criar e usar consultas parametrizadas no próximo tutorial!
Boa programação!
Leitura Adicional
Para obter mais informações sobre os tópicos discutidos neste tutorial, consulte os seguintes recursos:
- Visão geral do controle SqlDataSource
- ASP.NET Tutoriais de início rápido: o controle SqlDataSource
- O elemento Web.config
<connectionStrings>
- Referência de cadeia de conexão de banco de dados
Sobre o autor
Scott Mitchell, autor de sete livros ASP/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias da Web da Microsoft desde 1998. Scott trabalha como consultor, instrutor e escritor independente. Seu último livro é Sams Teach Yourself ASP.NET 2.0 em 24 horas. Ele pode ser contatado em mitchell@4GuysFromRolla.com. ou através de seu blog, que pode ser encontrado em http://ScottOnWriting.NET.
Agradecimentos especiais a
Esta série de tutoriais foi revisada por muitos revisores úteis. Os principais revisores deste tutorial foram Susan Connery, Bernadette Leigh e David Suru. Interessado em revisar meus próximos artigos do MSDN? Em caso afirmativo, envie-me uma mensagem para mitchell@4GuysFromRolla.com.