Sélection de données à l'aide du contrôle SqlDataSource

Mise à jour : novembre 2007

Vous pouvez utiliser le contrôle SqlDataSource pour récupérer des données d'une base de données avec peu ou pas de code. Le contrôle SqlDataSource peut fonctionner avec toutes les bases de données ayant un fournisseur ADO.NET associé configuré dans la section DbProviderFactories de la configuration, notamment Microsoft SQL Server, Oracle, ODBC ou des bases de données OLE DB comme Microsoft Access. La base de données que vous utilisez imposera la syntaxe des instructions SQL à utiliser par SqlDataSource et indiquera si vous pouvez utiliser des fonctionnalités de base de données plus avancées, comme les procédures stockées. Cela étant, le contrôle de source de données fonctionne de la même manière pour toutes les bases de données.

Pour récupérer des données d'une base de données à l'aide du contrôle SqlDataSource, vous devez définir au moins les propriétés suivantes :

  • ProviderName   A la valeur du nom du fournisseur ADO.NET qui représente la base de données que vous utilisez. Si vous utilisez Microsoft SQL Server, affectez à la propriété ProviderName la valeur "System.Data.SqlClient" ; si vous utilisez une base de données Oracle, affectez à la propriété ProviderName la valeur "System.Data.OracleClient", et ainsi de suite.

  • ConnectionString   A la valeur d'une chaîne de connexion qui fonctionne pour votre base de données.

  • SelectCommand    A la valeur d'une requête SQL ou d'une procédure stockée qui retourne des données de la base de données. La requête que vous définissez pour la propriété SelectCommand est la même que celle que vous définissez pour la propriété CommandText d'un objet ADO.NET IDbCommand lors de l'écriture du code ADO.NET pour l'accès aux données. La syntaxe réelle de la requête SQL dépend du schéma de vos données et de la base de données que vous utilisez.

Les sections suivantes décrivent ces propriétés de façon approfondie.

Spécification d'un nom de fournisseur

Vous devez affecter à la propriété ProviderName le nom du fournisseur ADO.NET associé au type de base de données dans laquelle vos données sont stockées. La liste des fournisseurs autorisés est enregistrée dans la section DbProviderFactories du fichier de configuration, qui est soit le fichier Machine.config, soit le fichier Web.config. Par défaut, le contrôle utilise SqlDataSource le fournisseur ADO.NET System.Data.SqlClient, qui correspond à Microsoft SQL Server. Par conséquent, si vous vous connectez à une base de données SQL Server, vous n'avez pas besoin de spécifier explicitement le fournisseur. Toutefois, vous pouvez également spécifier les fournisseurs System.Data.OracleClient, System.Data.Odbc ou System.Data.OleDb. Pour plus d'informations, consultez ADO.NET.

Remarque :

N'attribuez pas à la propriété ProviderName la valeur d'un fournisseur ADO non géré, tel que SQLOLEDB ou MSDAORA.

Spécification d'une chaîne de connexion

Vous devez affecter à la propriété ConnectionString la valeur d'une chaîne de connexion utilisée pour une base de données spécifique. Cependant, affecter à la propriété ConnectionString d'un contrôle SqlDataSource la valeur d'une chaîne de connexion spécifique est une stratégie difficile à gérer pour un site de grande taille. En outre, la chaîne de connexion se trouve alors stockée en texte brut dans la page ASP.NET. Pour rendre votre application Web plus facile à maintenir et mieux sécurisée, il est recommandé que vous stockiez les chaînes de connexion dans l'élément connectionStrings du fichier de configuration de l'application. Vous pourrez ensuite référencer la chaîne de connexion stockée en utilisant une expression de connexion comme celle de l'exemple suivant :

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

Pour plus de sécurité, vous pouvez chiffrer le contenu de la section de configuration <connectionStrings>. Pour plus d'informations, consultez Chiffrement et déchiffrement des sections de configuration.

Spécification de la commande Select

Vous pouvez spécifier une requête SQL que le contrôle SqlDataSource devra exécuter en définissant sa propriété SelectCommand. L'exemple suivant montre une requête SQL qui récupère un ensemble de résultats composés des noms de tous les employés figurant dans une table Employees :

SELECT LastName FROM Employees;

L'exemple de code suivant montre comment paramétrer les propriétés ConnectionString et SelectCommand d'un contrôle SqlDataSource pour qu'elles affichent les données Employés dans un contrôle 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>

Si la base de données que vous utilisez prend en charge les procédures stockées, vous pouvez affecter à la propriété SelectCommand le nom de la procédure stockée et paramétrer la propriété SelectCommandTypeStoredProcedure pour qu'elle indique que la propriété SelectCommand fait référence à une procédure stockée. L'exemple suivant montre une procédure stockée simple que vous pouvez créer dans SQL Server :

CREATE PROCEDURE sp_GetAllEmployees AS
    SELECT * FROM Employees;
GO

Pour configurer SqlDataSource afin qu'il utilise cette procédure stockée, attribuez au texte SelectCommand la valeur "sp_GetAllEmployees" et à la propriété SelectCommandType la valeur StoredProcedure.

La plupart des procédures stockées utilisent des paramètres. Pour plus d'informations sur l'utilisation de procédures stockées avec des paramètres, consultez Utilisation de paramètres avec le contrôle SqlDataSource.

Au moment de l'exécution, le contrôle SqlDataSource envoie le texte figurant dans la propriété SelectCommand à la base de données, et celle-ci retourne le résultat de la requête ou de la procédure stockée au contrôle SqlDataSource. Tout contrôle Web lié au contrôle de source de données affiche le jeu de résultats sur votre page ASP.NET.

Passage de paramètres aux instructions SQL

Les utilisateurs interagissent souvent avec les données en fonction de paramètres qui ne peuvent être résolus ou évalués qu'au moment de l'exécution. Par exemple, les données affichées dans une page Web ASP.NET peuvent représenter un rapport concernant une date spécifique. Si l'utilisateur sélectionne une date différente, les données du rapport peuvent également changer. Si la date est modifiée, de façon explicite par l'utilisateur, ou par programme par l'application Web, la requête SQL que vous soumettez à la base de données peut être rendue plus souple et plus facile à gérer s'il s'agit d'une requête SQL paramétrée, dans laquelle les éléments de l'instruction SQL sont liés aux variables d'application Web et évalués au moment de l'exécution.

Le contrôle SqlDataSource prend en charge les requêtes SQL paramétrées en associant les paramètres que vous ajoutez à la collection SelectParameters à des espaces réservés dans la requête SelectCommand. Les valeurs de paramètre peuvent être lues à partir d'un autre contrôle de la page, de l'état de session, du profil utilisateur ou d'autres éléments. Pour plus d'informations, consultez Utilisation de paramètres avec le contrôle SqlDataSource.

La syntaxe utilisée pour les espaces réservés varie en fonction du type de votre base de données. Si vous utilisez SQL Server, le nom du paramètre commence par le caractère "@" et correspond au nom de l'objet Parameter de la collection SelectParameters. Si vous utilisez une base de données ODBC ou OLE DB, les paramètres d'une instruction paramétrée ne sont pas nommés et sont plutôt spécifiés par le caractère d'espace réservé "?".

L'exemple suivant montre comment une requête SQL paramétrée récupère toutes les commandes de la base de données Northwind SQL Server d'après l'ID de l'employé actuellement connecté.

SELECT * FROM Orders WHERE EmployeeID = @empid

Dans cet exemple, l'expression @empid est le paramètre évalué au moment de l'exécution.

L'exemple de code suivant montre une requête SQL paramétrée qui prend la valeur du paramètre d'un autre contrôle de la page :

<!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>

Pour plus d'informations sur l'utilisation de paramètres avec le contrôle SqlDataSource, consultez Utilisation de paramètres avec le contrôle SqlDataSource. Pour plus d'informations générales sur l'utilisation des paramètres de source de données, consultez Utilisation de paramètres avec des contrôles de source de données.

Spécification du mode de retour des données

La propriété DataSourceMode du contrôle SqlDataSource détermine comment les données sont conservées par le contrôle SqlDataSource. Par défaut, la propriété DataSourceMode a la valeur DataSet, ce qui signifie que le jeu de résultats retourné par la base de données est stocké dans la mémoire serveur par le contrôle SqlDataSource. Lorsque le contrôle SqlDataSource récupère des données en mode DataSet, les contrôles associés liés aux données, tels que GridView et DetailsView, peuvent offrir de nombreuses fonctions d'affichage de données, telles que le tri et la pagination automatique.

Vous pouvez aussi affecter à la propriété DataSourceMode la valeur DataReader, ce qui signifie que le jeu de résultats n'est pas stocké en mémoire. Pour les scénarios dans lesquels vous n'avez pas besoin de conserver un jeu de résultats en mémoire sur le serveur, utilisez le mode DataReader.

L'exemple de code suivant montre comment affecter à la propriété DataSourceMode du contrôle SqlDataSource la valeur DataReader pour un scénario qui ne requiert ni tri, ni pagination ni filtrage.

<%@ 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>

Ajout d'un traitement personnalisé à l'aide d'événements du contrôle SqlDataSource

Le contrôle SqlDataSource expose des événements que vous pouvez gérer pour exécuter votre propre code avant que le contrôle n'ait exécuté une opération de récupération de données et après celle-ci.

Le contrôle SqlDataSource déclenche l'événement Selecting avant d'appeler la méthode Select pour exécuter la requête SQL définie dans la propriété SelectCommand. Vous pouvez gérer l'événement Selecting pour examiner la requête SQL avant qu'elle ne soit exécutée, pour valider des paramètres contenus dans la collection SelectParameters ou pour exécuter d'éventuels travaux supplémentaires avant la récupération des données. Par exemple, si vous utilisez un FormParameter avec le contrôle SqlDataSource, vous pouvez gérer l'événement Selecting pour valider la valeur du paramètre avant de récupérer les données. (FormParameter prend la valeur publiée dans un élément HTML et la transmet à la base de données sans validation.) Si la valeur n'est pas acceptable, vous pouvez annuler la requête en affectant à la propriété Cancel de l'objet SqlDataSourceSelectingEventArgs la valeur true.

Le contrôle SqlDataSource déclenche l'événement Selected après que les données ont été récupérées. Vous pouvez gérer l'événement Selected pour déterminer si une exception a été levée au cours de l'opération de base de données ou pour examiner les valeurs retournées par l'opération de données.

Affichage des données

Pour afficher des données dans une page ASP.NET, vous devez utiliser un contrôle lié aux données, tel qu'un contrôle GridView, DetailsView ou FormView, ou des contrôles tels que les contrôles ListBox ou DropDownList. Le contrôle lié aux données agit comme un consommateur des données que le contrôle SqlDataSource récupère. Affectez à la propriété DataSourceID du contrôle lié aux données l'ID du contrôle SqlDataSource. Lorsque la page est rendue, le contrôle SqlDataSource récupère les données et les rend disponibles pour le contrôle lié aux données, qui les affiche ensuite. Pour plus d'informations sur les contrôles liés aux données et sur la façon de les utiliser avec des contrôles de source de données pour afficher des données, consultez Vue d'ensemble des contrôles serveur Web liés aux données ASP.NET.

L'exemple de code suivant montre comment afficher les résultats de la requête à l'aide d'un contrôle 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>

Voir aussi

Concepts

Vue d'ensemble du contrôle serveur Web SqlDataSource