Compartilhar via


Selecionando Dados Usando o Controle SqlDataSource

Você pode usar o controle SqlDataSource para recuperar dados de um banco de dados com pouco ou nenhum código.O controle SqlDataSource pode trabalhar com qualquer banco de dados que possui um provedor ADO.NET associado configurado na seção de configuração DbProviderFactories, incluindo bancos de dados Oracle, Microsoft SQL Server, ODBC ou OLE DB, como o Microsoft Access.O banco de dados que você usar ditará a sintaxe das instruções SQL que você configura o SqlDataSource para usar e se você pode usar mais recursos avançados do banco de dados, como procedimentos armazenados.Entretanto, o controle de fonte de dados funciona da mesma maneira para todos os bancos de dados.

Para recuperar dados de um banco de dados usando o controle SqlDataSource, você precisa definir pelo menos as seguintes propriedades:

  • ProviderName   Defina como o nome do provedor ADO.NET que representa o banco de dados com que você está trabalhando.Se você estiver trabalhando com Microsoft SQL Server, defina a propriedade ProviderName como "System.Data.SqlClient"; se você estiver trabalhando com um banco de dados Oracle, defina a propriedade ProviderName como "System.Data.OracleClient"; e assim por diante.

  • ConnectionString   Defina como um sequência de conexão que funciona para seu banco de dados.

  • SelectCommand   Definido como um SQL de consulta ou procedimento armazenado que retorna dados do banco de dados.A consulta que você definir para a propriedade SelectCommand é a mesma consulta que você define para a propriedade CommandText de um objeto ADO.NET IDbCommand ao escrever código de acesso a dados ADO.NET.A sintaxe real da consulta SQL depende do esquema de seus dados e do banco de dados que você está usando.

As seções a seguir descrevem essas propriedades com mais detalhes.

Especificando um Nome de Provedor

Você define a propriedade ProviderName para nome do provedor ADO.NET asociado com o tipo de banco de dados no qual os dados estão armazenados.A lista de provedores permitidos está registrada na seção DbProviderFactories do arquivo de configuração, ou no arquivo Machine.config ou Web.config.Por padrão, o controle SqlDataSource usa o provedor System.Data.SqlClient ADO.NET, que corresponde ao Microsoft SQL Server.Portanto, se você estiver se conectando a um banco de dados SQL Server, você não precisará especificar um provedor explicitamente.Entretanto, você pode também especificar os provedores System.Data.OracleClient, System.Data.Odbc ou System.Data.OleDb.Para obter mais informações, consulte ADO.NET.

Observação:

Não defina a propriedade ProviderName como o valor de um provedor ADO não gerenciado, como SQLOLEDB ou MSDAORA.

Especificando uma Sequência de Conexão

Você define a propriedade ConnectionString para uma sequência de conexão usado para um banco de dados específico.No entanto, definindo a propriedade ConnectionString de um controle SqlDataSource para uma sequência de conexão específica não é uma estratégia muito sustentável para sites grandes.Além disso, a sequência de conexão é então armazenada em texto sem-formatação na página ASP.NET.Para tornar seu aplicativo Web Web mais passível de manutenção e mais seguro, é recomendável que você armazene seqüências de conexão no connectionStrings elemento no arquivo de configuração do aplicativo Web.Você pode fazer referência à sequência de conexão armazenada usando uma expressão de conexão como a do exemplo a seguir:

<asp:SqlDataSource 
  ID="SqlDataSource1" 
   
  ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
   SelectCommand="SELECT * FROM [Categories]">
</asp:SqlDataSource>

Para obter segurança adicional, você pode criptografar o conteúdo da seção de configuração <connectionStrings>.Para obter mais informações, consulte Criptografando e Descriptografando Seções de Configuração.

Especificando o Comando Select

Você pode especificar uma consulta SQL para o controle SqlDataSource para executar definindo sua propriedade SelectCommand.O exemplo a seguir demonstra uma consulta SQL que recupera um conjunto de resultados consistindo dos sobrenomes de todos os funcionários em uma Employees tabela:

SELECT LastName FROM Employees;

O exemplo de código a seguir mostra como você pode definir as propriedades ConnectionString e SelectCommand de um controle SqlDataSource para exibir os dados dos Funcionários em um controle GridView:

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>

Se o banco de dados que você está trabalhando suporta procedimentos armazenados, você pode definir a propriedade SelectCommand com o nome da procedimento armazenado e a propriedade SelectCommandTypeStoredProcedure para indicar que a propriedade SelectCommand se refere a um procedimento armazenado.O exemplo a seguir demonstra uma simples stored procedure que você pode criar no SQL Server:

CREATE PROCEDURE sp_GetAllEmployees AS
    SELECT * FROM Employees;
GO

Para configurar o SqlDataSource para usar este procedimento armazenado, defina o texto SelectCommand para "sp_GetAllEmployees" e a propriedade SelectCommandType para StoredProcedure.

A maioria das stored procedures usam parâmetros.Para obter mais informações sobre como usar procedimentos armazenados com parâmetros, consulte Usando parâmetros com o controle SqlDataSource.

Em tempo de execução, o controle SqlDataSource envia o texto na propriedade SelectCommand para o banco de dados, e o banco de dados retorna o resultado da consulta ou procedimento armazenado para o controle SqlDataSource.Quaisquer controles Web que estão acoplados ao controle da fonte de dados exibem o conjunto de resultados na sua página ASP.NET.

Passando Parâmetros para Instruções SQL

Usuários frequentemente interagem com dados baseados nos parâmetros que podem ser resolvidos ou avaliados apenas em tempo de execução.Por exemplo, dados exibidos em um página da Web ASP.NET pode representar um relatório para uma data específica.Se o usuário seleciona uma data diferente, os dados no relatório também podem ser alterados.Se a data é modificada explicitamente pelo usuário ou programaticamente pelo aplicativo da Web, a consulta SQL que você submete ao banco de dados pode ser feita mais flexível e mais passível de manutenção se for uma consulta SQL parametrizada, na qual elementos da instrução SQL estão vinculados às variáveis do aplicativo da Web e são avaliadas em tempo de execução.

O controle SqlDataSource suporta consultas parametrizadas SQL associando parâmetros que você adiciona à coleção SelectParameters com espaços reservados na consulta SelectCommand.Valores de parâmetro podem ser lidos de outro controle na página, de estado de sessão, de perfil de usuário e de outros elementos.Para obter mais informações, consulte Usando parâmetros com o controle SqlDataSource.

A sintaxe usada para os espaços reservados varia, dependendo do tipo de seu banco de dados.Se você estiver trabalhando com SQL Server, o nome do parâmetro começa com o caractere '@' e seu nome corresponde ao nome do objeto Parameter na coleção SelectParameters.Se você estiver trabalhando com um banco de dados ODBC ou OLE DB, os parâmetros em uma instrução parametrizada não são nomeados e, em vez disso, são especificados com o caractere de espaço reservado '?'.

O exemplo a seguir demonstra como uma consulta SQL parametrizada recupera todos os pedidos no banco de dados SQL Server Northwind, com base na identificação do funcionário atualmente conectado.

SELECT * FROM Orders WHERE EmployeeID = @empid

No exemplo, a expressão @empid é o parâmetro que é avaliado em tempo de execução.

O exemplo de código a seguir demonstra uma consulta SQL com parâmetros que tem o valor do parâmetro de outro controle na página:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <p><asp:dropdownlist
          id="DropDownList1"
          
          autopostback="True">
          <asp:listitem selected="True">Sales Representative</asp:listitem>
          <asp:listitem>Sales Manager</asp:listitem>
          <asp:listitem>Vice President, Sales</asp:listitem>
      </asp:dropdownlist></p>

      <asp:sqldatasource
          id="SqlDataSource1"
          
          connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
          selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <selectparameters>
              <asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
          </selectparameters>
      </asp:sqldatasource>

      <p><asp:listbox
          id="ListBox1"
          
          datasourceid="SqlDataSource1"
          datatextfield="LastName">
      </asp:listbox></p>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <p><asp:dropdownlist
          id="DropDownList1"
          
          autopostback="True">
          <asp:listitem selected="True">Sales Representative</asp:listitem>
          <asp:listitem>Sales Manager</asp:listitem>
          <asp:listitem>Vice President, Sales</asp:listitem>
      </asp:dropdownlist></p>

      <asp:sqldatasource
          id="SqlDataSource1"
          
          connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
          selectcommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <selectparameters>
              <asp:controlparameter name="Title" controlid="DropDownList1" propertyname="SelectedValue"/>
          </selectparameters>
      </asp:sqldatasource>

      <p><asp:listbox
          id="ListBox1"
          
          datasourceid="SqlDataSource1"
          datatextfield="LastName">
      </asp:listbox></p>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <p><asp:DropDownList
          id="DropDownList1"
          
          AutoPostBack="True">
          <asp:ListItem Selected="True">Sales Representative</asp:ListItem>
          <asp:ListItem>Sales Manager</asp:ListItem>
          <asp:ListItem>Vice President, Sales</asp:ListItem>
      </asp:DropDownList></p>

      <asp:SqlDataSource
          id="SqlDataSource1"
          
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees WHERE Title = @Title">
          <SelectParameters>
              <asp:ControlParameter Name="Title" ControlId="DropDownList1" PropertyName="SelectedValue"/>
          </SelectParameters>
      </asp:SqlDataSource>

      <p><asp:ListBox
          id="ListBox1"
          
          DataSourceID="SqlDataSource1"
          DataTextField="LastName">
      </asp:ListBox></p>

    </form>
  </body>
</html>

Para obter mais informações sobre como usar parâmetros com o controle SqlDataSource, consulte Usando parâmetros com o controle SqlDataSource.Para obter informações mais gerais sobre como usar parâmetros da fonte de dados, consulte Usando parâmetros com controles de fonte de dados.

Especificando como Dados são Retornados

A propriedade DataSourceMode do controle SqlDataSource determina como os dados são mantidos pelo controle SqlDataSource.Por padrão, a propriedade DataSourceMode é definida como DataSet, o que significa que o conjunto de resultados retornados pelo banco de dados é armazenado na memória do servidor pelo controle SqlDataSource.Quando o controle SqlDataSource recupera dados no modo DataSet, controles ligados a dados associados, como GridView e DetailsView, podem oferecem recursos de exibição de dados custosos, como a classificação automática e paginação.

Como alternativa, você pode definir a propriedade DataSourceMode para DataReader, o que significa que o conjunto de resultados não é armazenado na memória.Para cenários em que você não precisa para manter um conjunto de resultados na memória do servidor, use o modo DataReader.

O exemplo de código a seguir demonstra como para definir a propriedade DataSourceMode do controle SqlDataSourceDataReader para um cenário que não requer nenhuma classificação, paginação ou filtragem.

<%@ Page language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<%@ Page language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >
      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT LastName FROM Employees">
      </asp:SqlDataSource>

      <asp:ListBox
          id="ListBox1"
          
          DataTextField="LastName"
          DataSourceID="SqlDataSource1">
      </asp:ListBox>

    </form>
  </body>
</html>

Adicionando Processamento Personalizado Usando Eventos de Controle SqlDataSource

O controle SqlDataSource expõe eventos que você pode manipular para executar seu próprio código antes e após o controle executar uma operação de recuperação de dados.

O controle SqlDataSource gera o evento Selecting antes de ele chamar o método Select para executar a consulta SQL definida na propriedade SelectCommand.Você pode manipular o evento Selecting para examinar a consulta SQL antes que ela execute e para validar os parâmetros que estão contidos na coleção SelectParameters ou para executar qualquer trabalho adicional antes de recuperar dados.Por exemplo, se você estiver usando um controle FormParameter com o SqlDataSource, você pode manipular o evento Selecting para validar o valor do parâmetro antes de recuperar dados.(O FormParameter leva o valor lançado em um elemento HTML e o envia para o banco de dados sem qualquer validação). Se o valor não for aceitável, você pode cancelar a consulta por configuração da propriedade Cancel do objeto SqlDataSourceSelectingEventArgs do evento como true.

O controle SqlDataSource gera o evento Selected após os dados terem sido recuperados.Você pode manipular o evento Selected para determinar se uma exceção foi acionada durante a operação de banco de dados ou para examinar os valores retornados pela operação de dados.

Exibindo os Dados

Para exibir o dados em uma página ASP.NET, você utiliza um controle vinculado a dados, como um controle GridView, DetailsView ou FormView, ou controles, como os controles ListBox ou DropDownList.O controle vinculado a dados atua como um consumidor de dados que o controle SqlDataSource recupera.Defina a propriedade DataSourceID do controle vinculado a dados para a identificação do controle SqlDataSource.Quando a página é processada, o controle SqlDataSource recupera os dados e torna-o disponível para o controle vinculado a dados, que, por sua vez, exibe os dados.Para obter mais informações sobre os controles ligados a dados e como usá-las com controles de fonte de dados para exibir dados, consulte Visão geral de controle servidor Web com dados vinculados.

O exemplo de código a seguir demonstra como exibir os resultados da consulta usando um controle GridView.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
  <head >
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="form1" >

      <asp:SqlDataSource
          id="SqlDataSource1"
          
          DataSourceMode="DataReader"
          ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
          SelectCommand="SELECT FirstName, LastName, Title FROM Employees">
      </asp:SqlDataSource>

      <asp:GridView
          id="GridView1"
          
          DataSourceID="SqlDataSource1">
      </asp:GridView>

    </form>
  </body>
</html>

Consulte também

Conceitos

Visão geral sobre o controle de servidor Web SqlDataSource