Compartilhar via


Consultar dados com o controle SqlDataSource (C#)

por Scott Mitchell

Baixar PDF

Nos tutoriais anteriores, usamos o controle ObjectDataSource para separar totalmente a camada de apresentação da camada de Acesso a Dados. A partir deste 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 DAL (Camada de Acesso a Dados) foi criada no primeiro tutorial (Criando uma camada de acesso a dados) e na camada de lógica de negócios na segunda (Criando uma camada lógica de negócios). Começando com o tutorial Exibindo dados com o ObjectDataSource , vimos como usar ASP.NET novo controle ObjectDataSource do ASP.NET 2.0 para interface declarativa 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 em camadas é vitalmente importante para o sucesso, a atualização e a facilidade de manutenção do aplicativo. No entanto, o desenvolvimento de uma arquitetura robusta pode ser desnecessário ao criar aplicativos extremamente simples e únicos.

ASP.NET 2.0 fornece cinco controles internos de fonte de dados 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.

ASP.NET 2.0 inclui cinco controles de fonte de dados Built-In

Figura 1: ASP.NET 2.0 inclui cinco controles de fonte de dados Built-In

Comparando 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 que as propriedades de ObjectDataSource tiverem sido configuradas, um controle da Web de dados, como GridView, DetailsView ou DataList, poderá ser associado ao controle, usando os métodos ObjectDataSource s 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 em uma biblioteca de objetos. Com o SqlDataSource, devemos especificar o banco de dados cadeia de conexão e as consultas SQL ad hoc ou procedimentos armazenados a serem executados para inserir, atualizar, excluir e recuperar dados. Os métodos SqlDataSource, Select()Insert(), Update()eDelete(), 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 grunt de se conectar a um banco de dados, emitir uma consulta e retornar os resultados.

O SqlDataSource serve como um proxy para o banco de dados

Figura 2: o SqlDataSource serve como um proxy para o banco de dados

Observação

Neste tutorial, nos concentraremos 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 a ASP.NET 2.0 para 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 de 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 do SqlDataSource

Antes de começarmos a explorar como trabalhar diretamente com dados de banco de dados usando o controle SqlDataSource, vamos primeiro tirar 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 ASP.NET páginas a essa pasta, certificando-se de associar cada página à Site.master página master:

  • Default.aspx
  • Querying.aspx
  • ParameterizedQueries.aspx
  • InsertUpdateDelete.aspx
  • OptimisticConcurrency.aspx

Adicionar as páginas de ASP.NET para os tutoriais do SqlDataSource-Related

Figura 3: Adicionar as páginas de ASP.NET para os tutoriais do SqlDataSource-Related

Assim 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 ao Default.aspx arrastando-o do Gerenciador de Soluções para o modo design da página.

Adicione o controle de usuário SectionLevelTutorialListing.ascx ao Default.aspx

Figura 4: Adicionar o controle de SectionLevelTutorialListing.ascx usuário a Default.aspx (clique para exibir a 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 a adição de botões personalizados para DataList e Repeater <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>

Depois de atualizar Web.sitemap, reserve um momento para exibir 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.

O mapa do site agora inclui entradas para os tutoriais do SqlDataSource

Figura 5: O mapa do site agora inclui entradas para os tutoriais do SqlDataSource

Etapa 2: Adicionar e configurar 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 como IDProductsDataSource. 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 sqlDataSource.

Clique na Source Link Configurar Dados da Marca Inteligente sqlDataSource

Figura 6: Clique no Source Link Configurar Dados da Marca Inteligente sqlDataSource

Isso abre o assistente Configurar Fonte de Dados do controle SqlDataSource. Embora as etapas do assistente diferem dos controles 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 envolve especificar o banco de dados subjacente a ser usado e fornecer 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ó Connections de Dados no Explorer do Servidor. Como já adicionamos um cadeia de conexão para o NORTHWIND.MDF banco de dados na App_Data pasta ao arquivo do Web.config nosso projeto, a lista suspensa inclui uma referência a esse cadeia de conexão, NORTHWINDConnectionString. Escolha este item na lista suspensa e clique em Avançar.

Escolha NORTHWINDConnectionString na Lista de Drop-Down

Figura 7: Escolher 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 serem retornadas ou inserir uma instrução SQL personalizada ou especificar um procedimento armazenado. Você pode alternar entre essa opção por meio de Especificar uma instrução SQL personalizada ou procedimento armazenado e Especificar colunas de uma tabela ou exibir botões de opção.

Observação

Para este primeiro exemplo, vamos usar a opção Especificar colunas de uma tabela ou exibição. Retornaremos 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 Configurar a Instrução Select quando o botão de opção Especificar colunas de uma tabela ou exibição estiver selecionado. A lista suspensa contém o conjunto de tabelas e exibições no banco de dados Northwind, com as colunas de tabela ou exibição selecionadas exibidas na lista de caixas de seleção abaixo. Para este exemplo, vamos retornar as ProductIDcolunas , ProductNamee UnitPrice da Products 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.

Retornar dados da tabela Products

Figura 8: Retornar dados da Products tabela

Depois de configurar o assistente para retornar as ProductIDcolunas , ProductNamee UnitPrice da Products tabela, clique no botão Avançar. Esta tela final oferece uma oportunidade de examinar os resultados da consulta configurada da etapa anterior. Clicar no botão Testar Consulta executa a instrução configurada SELECT e exibe os resultados em uma grade.

Clique no botão Testar Consulta para examinar sua consulta SELECT

Figura 9: Clique no botão Testar Consulta para examinar sua SELECT consulta

Para concluir o assistente, clique em Concluir.

Assim como acontece com o ObjectDataSource, o assistente do SqlDataSource simplesmente atribui valores às propriedades do controle s, ou seja, as ConnectionString propriedades e SelectCommand . Depois de concluir o assistente, a marcação declarativa do controle SqlDataSource deverá 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 receber um valor de cadeia de conexão completo e embutido em código ou pode apontar para um cadeia de conexão em Web.config. Para referenciar 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 Web.config<connectionStrings> seção . No entanto, a sintaxe pode ser usada para referenciar <appSettings> elementos ou conteúdo de arquivos de recursos. Consulte Visão geral das expressões de 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: Adicionar um controle da Web de dados e vinculá-lo ao SqlDataSource

Depois que o SqlDataSource tiver sido configurado, ele poderá ser associado a um controle da Web de dados, como 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 ProductsDataSource ao SqlDataSource escolhendo a fonte de dados na lista suspensa na marca inteligente GridView.

Adicionar um GridView e associá-lo ao controle SqlDataSource

Figura 10: Adicionar um GridView e associá-lo ao controle SqlDataSource (Clique para exibir a imagem em tamanho real)

Depois de selecionar o controle SqlDataSource na lista suspensa na marca inteligente 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 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 ProductName propriedade do campo para Nome do HeaderText Produto e os UnitPrice campos para Preço. Também formate 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 por meio de um navegador. Como mostra a Figura 11, o GridView lista os valores , e UnitPrice de ProductIDProductNamecada produto.

O GridView exibe os valores ProductID, ProductName e UnitPrice de cada produto

Figura 11: o GridView exibe os valores , ProductIDProductNamee UnitPrice de cada produto (clique para exibir a imagem em tamanho real)

Quando a página é visitada, o GridView invoca seu método de controle da fonte de Select() dados. Quando estávamos usando o controle ObjectDataSource, isso chamou o ProductsBLL método da classe s GetProducts() . No entanto, com o SqlDataSource, 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 de controle da Web de dados Built-In e o controle 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 ela está associada a um ObjectDataSource ou a um SqlDataSource. No entanto, determinados recursos de controle da Web de dados são confidenciais 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 grandes quantidades de dados, discutimos como, por padrão, a lógica de paginação dos controles da Web de dados retorna nativamente todos os registros da fonte de dados subjacente e exibe apenas o subconjunto apropriado de registros dado o índice de página atual e o número de registros a serem exibidos por página. Esse modelo é altamente ineficiente ao paginar por meio de 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. No entanto, o controle SqlDataSource 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, marcar as opções Habilitar Paginação e Habilitar Classificação na marca inteligente gridView e Querying.aspx verificar 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 implementar a paginação pode ser apurado do 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. O uso de um DataReader pode ser preferencial 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 da Web de dados não poderá classificar nem página, pois o SqlDataSource não pode determinar quantos registros são retornados pela consulta, nem o DataReader oferece técnicas 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 na Products tabela. Vamos examinar usando uma instrução SQL personalizada.

Adicione outro controle GridView à Querying.aspx página e escolha 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 que criará um novo controle SqlDataSource. Nomeie o controle ProductsWithCategoryInfoDataSourcecomo .

Criar um novo controle SqlDataSource chamado ProductsWithCategoryInfoDataSource

Figura 12: Criar um novo controle SqlDataSource chamado ProductsWithCategoryInfoDataSource

A próxima tela solicita que especifiquemos 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 Select, 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 guia, você pode inserir uma instrução SQL personalizada na caixa de texto ou escolher um procedimento armazenado na lista suspensa. Neste tutorial, examinaremos a inserção de uma instrução SQL personalizada; o próximo tutorial inclui um exemplo que usa um procedimento armazenado.

Insira uma instrução SQL personalizada ou escolha 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 e ProductName da Products tabela usando um JOIN para recuperar os produtos da CategoryNameCategories tabela:

SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Categories
    INNER JOIN Products ON
        Categories.CategoryID = Products.CategoryID

Você pode criar graficamente a consulta usando o Construtor de Consultas

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 Consulta de Teste. Clique em Concluir para concluir o assistente sqlDataSource.

Depois de concluir o assistente, o GridView terá três BoundFields adicionados a ele exibindo as ProductIDcolunas , ProductNamee CategoryName 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>

O GridView mostra a ID, o nome e o nome da categoria associados de cada produto

Figura 15: GridView mostra a ID, o nome e o nome da categoria associados de cada produto (clique para exibir a imagem em tamanho real)

Resumo

Neste tutorial, vimos como consultar e exibir dados usando o controle SqlDataSource. Assim 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 do janela Propriedades ou usando o assistente Configurar DataSource.

Os SELECT exemplos de consulta que examinamos neste tutorial retornaram todos os registros da consulta especificada. No entanto, o controle SqlDataSource pode incluir uma WHERE cláusula com parâmetros cujos valores são atribuídos programaticamente ou são automaticamente extraídos de uma fonte especificada. Examinaremos como criar e usar consultas parametrizadas no próximo tutorial!

Programação feliz!

Leitura Adicional

Para obter mais informações sobre os tópicos discutidos neste tutorial, consulte os seguintes recursos:

Sobre o autor

Scott Mitchell, autor de sete livros do ASP/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias da Microsoft Web desde 1998. Scott trabalha como consultor independente, treinador e escritor. 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

Esta série de tutoriais foi revisada por muitos revisores úteis. Os principais revisores deste tutorial foram Susan Connery, Bernadete Leigh e David Suru. Interessado em revisar meus próximos artigos do MSDN? Nesse caso, solte-me uma linha em mitchell@4GuysFromRolla.com.