Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 rigorosa de apresentação e acesso a dados.
Introdução
Todos os tutoriais que examinamos até agora usaram uma arquitetura hierárquica 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 o novo controle ObjectDataSource do ASP.NET 2.0 para interagir 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 específicas do banco de dados 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 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 Built-In
Comparando o ObjectDataSource e 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 de configuradas as propriedades do ObjectDataSource, um controlo de dados Web, como GridView, DetailsView ou DataList, pode ser vinculado ao controlo usando os métodos do 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 SqlDataSource s Select(), Insert(), Update(), e Delete() quando invocados, se conectam ao banco de dados especificado e emitem a consulta SQL apropriada. Como o diagrama a seguir ilustra, esses métodos fazem o trabalho árduo 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, 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 trabalhar exclusivamente com o Microsoft Access com o controle SqlDataSource projetado para trabalhar exclusivamente com o Microsoft SQL Server. Enquanto o AccessDataSource é projetado para trabalhar especificamente com o Microsoft Access, o controle SqlDataSource funciona com qualquer banco de dados relacional que pode ser acessado através do .NET. Isso inclui qualquer armazenamento de dados compatível 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: Criação das páginas da Web do SqlDataSource
Antes de começarmos a explorar como trabalhar diretamente com dados de banco de dados usando o controle SqlDataSource, vamos primeiro reservar 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.aspxQuerying.aspxParameterizedQueries.aspxInsertUpdateDelete.aspxOptimisticConcurrency.aspx
Figura 3: Adicionar as páginas de ASP.NET para os tutoriais SqlDataSource-Related
Como nas outras pastas, Default.aspx na SqlDataSource pasta irá listar os tutoriais em sua seção. Lembre-se de que o SectionLevelTutorialListing.ascx Controle de Usuário fornece essa funcionalidade. Portanto, adicione este Controlo de Usuário a Default.aspx arrastando-o do Gerenciador de Soluções para a visualização Design da página.
Figura 4: Adicionar o controle de usuário a SectionLevelTutorialListing.ascx (Default.aspx imagem em tamanho real)
Por último, adicione estas quatro páginas como entradas ao Web.sitemap ficheiro. Especificamente, adicione a seguinte marcação após a adição de botões personalizados à DataList 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 através 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 SqlDataSource
Etapa 2: Adicionando e configurando o controle SqlDataSource
Comece por abrir a página Querying.aspx na pasta SqlDataSource e mude para o modo de Design. Arraste um controlo SqlDataSource da caixa de ferramentas para o Designer e defina suas propriedades de ID para ProductsDataSource. Como 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 etiqueta inteligente do SqlDataSource.
Figura 6: Clique no link Configurar Fonte de Dados da etiqueta inteligente do SqlDataSource
Isso abre o assistente de configuração da fonte de dados para o controlo SqlDataSource. Embora as etapas do assistente sejam diferentes dos controles ObjectDataSource, o objetivo final é o mesmo 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.
O primeiro passo do assistente pede-nos 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 a base de dados NORTHWIND.MDF no ficheiro App_Data do nosso projeto na pasta Web.config, a lista de opções 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 botão NORTHWINDConnectionString na lista de Drop-Down
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 ser retornada ou podemos inserir uma instrução SQL personalizada ou especificar um procedimento armazenado. Você pode alternar entre essas opções usando os botões de opção Especificar uma instrução SQL personalizada ou procedimento armazenado e Especificar colunas de uma tabela ou vista.
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 procedimento armazenado.
A Figura 8 mostra a tela Configure the Select Statement quando o botão de opção Specify columns from a table or view (Especificar colunas de uma tabela ou exibição) é selecionado. A lista suspensa contém o conjunto de tabelas e vistas do banco de dados Northwind, com as colunas da tabela ou vista selecionada exibidas na lista de caixas de seleção abaixo. Para este exemplo, vamos retornar as colunas ProductID, ProductName e UnitPrice da tabela Products. 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: Dados de retorno da Products tabela
Depois de configurar o assistente para retornar as colunas ProductID, ProductName e UnitPrice da tabela Products, clique no botão Avançar. Esta tela final oferece uma oportunidade para 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 Test Query para revisar sua SELECT consulta
Para concluir o assistente, clique em Concluir.
Como acontece com o ObjectDataSource, o assistente do SqlDataSource apenas atribui valores às propriedades do controle, ou seja, as propriedades ConnectionString 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. Esta 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 no Web.config, use a sintaxe <%$ expressionPrefix:expressionValue %>. Normalmente, expressionPrefix é ConnectionStrings e expressionValue é o nome da cadeia de conexão na Web.config<connectionStrings> seção . No entanto, a sintaxe pode ser usada para fazer referência <appSettings> a elementos ou conteúdo de arquivos de recursos. Consulte Visão geral de expressões ASP.NET 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 da Web de dados e vinculando-o ao SqlDataSource
Depois que o SqlDataSource tiver sido configurado, ele pode ser vinculado a um controle da 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 tag inteligente do GridView.
Figura 10: Adicionar um GridView e vinculá-lo ao controle SqlDataSource (Clique para exibir a imagem em tamanho real)
Depois de selecionar o controlo SqlDataSource na lista suspensa no smart tag do GridView, o Visual Studio adicionará automaticamente um BoundField ou CheckBoxField ao GridView para cada uma das colunas retornadas pelo controlo da fonte de dados. Como o SqlDataSource retorna três colunas ProductIDde banco de dados , ProductNamee UnitPrice há três campos no GridView.
Reserve um momento para configurar os três BoundFields do GridView. Altere a propriedade do campo ProductName para Nome do Produto e a do campo HeaderText 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 ProductID, ProductName, e UnitPrice de cada produto.
Figura 11: O GridView exibe os valores de ProductID, ProductName e UnitPrice de cada produto (Clique para visualizar a imagem em tamanho real)
Quando a página é visitada, o GridView invoca seu método de controle de fonte de Select() dados. Quando estávamos a usar o controlo ObjectDataSource, isto invocou o método ProductsBLL da classe GetProducts(). 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.
As funcionalidades de controlo web de dados Built-In e o controlo SqlDataSource
Em geral, os recursos inerentes aos controles da Web de dados paginando, classificando, editando, excluindo, inserindo e assim por diante são específicos para o controle da Web de dados e não dependem do controle da fonte de dados usado. Ou seja, o GridView pode utilizar sua paginação interna, classificação, edição e exclusão se ele está vinculado a um ObjectDataSource ou 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 Eficaz de Grandes Quantidades de Dados, discutimos como, por padrão, a lógica de paginação dos controlos Web de dados, ao retornar de forma simplista todos os registos da fonte de dados subjacente, exibe apenas o subconjunto apropriado de registos dado o índice de página atual e o número de registos a serem exibidos por página. Este modelo é altamente ineficiente ao paginar através de conjuntos de resultados suficientemente grandes. Felizmente, o ObjectDataSource pode ser configurado para suportar paginação personalizada, que retorna apenas o subconjunto preciso de registros a serem exibidos. O controle SqlDataSource, no entanto, não possui 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 através do GridView. Para demonstrar isso, marque as opções Habilitar paginação e Habilitar classificação na marca inteligente do GridView em Querying.aspx e verifique se funciona como esperado.
A classificação e a paginação funcionam porque o SqlDataSource recupera os dados do banco de dados em um DataSet vagamente tipado. O número total de registros retornados pela consulta, um aspeto essencial para implementar a paginação, pode ser verificado a partir do DataSet. Além disso, os resultados do DataSet podem ser classificados através 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 preferido em situações em que se passa os resultados do SqlDataSource para o código existente que espera um DataReader. Além disso, como DataReaders são objetos consideravelmente mais simples do que DataSets, eles oferecem melhor desempenho. Se você fizer essa alteração, no entanto, o controle da Web de dados não pode classificar nem página, uma vez que o SqlDataSource não pode determinar quantos registros são retornados pela consulta, nem o DataReader oferece quaisquer técnicas para classificar os dados retornados.
Etapa 4: Usando uma instrução SQL personalizada ou 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. Vamos examinar o uso de uma instrução SQL personalizada.
Adicione outro controle GridView à página Querying.aspx e escolha criar uma nova fonte de dados a partir da lista suspensa na smart tag. 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 o NORTHWINDConnectionString na lista suspensa e clique em Avançar. Na tela Configurar a instrução Selecionar, escolha o botão de opção Especificar uma instrução SQL personalizada ou procedimento armazenado e clique em Avançar. Isso abrirá a tela Definir instruções personalizadas ou procedimentos armazenados, que oferece guias rotuladas como SELECT, UPDATE, INSERT e DELETE. Em cada separador, pode inserir uma instrução SQL personalizada na caixa de texto ou escolher um procedimento armazenado a partir da lista desdobrável. Neste tutorial, veremos como inserir uma instrução SQL personalizada; O próximo tutorial inclui um exemplo que usa um procedimento armazenado.
Figura 13: Insira uma instrução SQL personalizada ou escolha 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 campos ProductID e ProductName da tabela Products usando um JOIN para recuperar o CategoryName do produto da tabela Categories.
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 colunas ProductID, ProductName e CategoryName retornadas da consulta, 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 o ID, o nome e o nome da categoria associada de cada produto (Clique para visualizar 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 através 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!
Feliz 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 sobre ASP/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias Web da Microsoft desde 1998. Scott trabalha como consultor, formador e escritor independente. Seu último livro é Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Ele pode ser contatado em mitchell@4GuysFromRolla.com.
Um agradecimento especial 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 rever meus próximos artigos do MSDN? Se for o caso, envie-me uma mensagem para mitchell@4GuysFromRolla.com.