Share via


Procédure pas à pas : utilisation d'un horodatage avec le contrôle LinqDataSource pour vérifier l'intégrité des données

Mise à jour : novembre 2007

Dans cette procédure pas à pas, vous apprendrez comment utiliser un horodatage pour vérifier les conflits de données lorsque vous mettez à jour des données à l'aide d'un contrôle LinqDataSource. Le contrôle LinqDataSource stocke la valeur d'horodatage dans la page Web. Lorsque l'utilisateur met à jour ou supprime des données, le contrôle LinqDataSource compare la valeur d'horodatage avec la valeur d'horodatage actuelle dans la base de données. Si le contrôle LinqDataSource détecte que la valeur dans la colonne d'horodatage a changé, il ne met pas à jour ou ne supprime pas l'enregistrement. Dans ce cas, l'enregistrement a été modifié par un autre processus. À la place, le contrôle LinqDataSource lève une exception qui indique que l'enregistrement a changé.

Une colonne d'horodatage est mise à jour automatiquement par SQL Server chaque fois que l'enregistrement est modifié. Pour plus d'informations, consultez Timestamp (Transact-SQL) (en anglais). Dans la classe d'entité, une colonne d'horodatage est marquée et la propriété IsVersion a la valeur true.

Si vous n'utilisez pas de colonne d'horodatage, le contrôle LinqDataSource vérifie l'accès concurrentiel aux données en stockant des valeurs dans la page Web. Les valeurs d'accès concurrentiel se composent des colonnes utilisées comme clé primaire dans la table, ou bien de celles marquées avec UpdateCheck.Always ou UpdateCheck.WhenUpdated dans la propriété UpdateCheck de l'attribut ColumnAttribute. LINQ to SQL vérifie ces valeurs par rapport à la base de données de mettre à jour les données ou de les supprimer. Cette approche peut créer une page Web volumineuse si l'enregistrement de données contient de nombreuses colonnes ou d'importantes valeurs de colonne. Il peut également représenter un problème de sécurité si l'enregistrement contient des données que vous ne souhaitez pas exposer dans la page.

Vous utiliserez le Concepteur Objet/Relationnel pour créer une classe qui représente la table de base de données. Le contrôle LinqDataSource agira sur cette classe générée afin de récupérer, de mettre à jour, d'insérer et de supprimer des données.

Composants requis

Pour implémenter les procédures dans votre propre environnement de développement, vous avez besoin des éléments suivants :

  • Visual Web Developer Express ou Visual Studio 2008.

  • SQL Server Express Edition installé sur votre ordinateur. Si SQL Server est installé, vous pouvez l'utiliser, mais vous devrez apporter de légères modifications à certaines des procédures.

  • avoir un site Web ASP.NET.

Création d'une table de base de données

Pour exécuter les étapes dans cette procédure pas à pas, vous devez avoir une table de base de données qui contient une colonne d'horodatage. Si vous n'avez pas encore une telle table, vous pouvez en créer une en effectuant les étapes décrites dans la procédure suivante. Si vous utilisez une table existante, les étapes de certaines procédures ne correspondront pas tout à fait à la base de données. Toutefois, les concepts illustrés dans la procédure pas à pas seront les mêmes.

Pour créer une table de base de données avec une colonne d'horodatage

  1. Si le site Web ne possède pas déjà un dossier App_Data, dans l'Explorateur de solutions, cliquez avec le bouton droit sur le projet, cliquez sur Ajouter le dossier ASP.NET, puis cliquez sur App_Data.

  2. Cliquez avec le bouton droit sur le dossier App_Data, puis cliquez sur Ajouter un nouvel élément.

  3. Sous Modèles installés, sélectionnez Base de données SQL, renommez le fichier en Reviews.mdf, puis cliquez sur Ajouter.

  4. Dans l'Explorateur de serveurs, ouvrez le nœud Reviews.mdf puis cliquez avec le bouton droit sur le dossier Tables.

  5. Cliquez sur Ajouter une nouvelle table.

  6. Créez les colonnes suivantes dans la table :

    Nom de la colonne

    Type de données

    Propriétés

    BookID

    int

    IsIdentity = Yes

    Non null

    Clé primaire

    Title

    nvarchar(50)

    Author

    nvarchar(50)

    RecommendToBookGroup

    bit

    Non null

    Review

    nvarchar(1000)

    Horodateur

    timestamp

    Non null

  7. Enregistrez la table et nommez-la BookReviews.

  8. Ajoutez plusieurs enregistrements à la table BookReviews avec les exemples de données.

    Dans l'Explorateur de serveurs, cliquez avec le bouton droit sur la table BookReviews et cliquez sur Afficher les données de la table. Vous n'avez pas à spécifier de valeur pour BookID ou Timestamp parce que ces valeurs sont générées par la base de données.

Création de classes pour représenter des entités de base de données

Pour utiliser le contrôle LinqDataSource, vous travaillez avec les classes qui représentent des entités de base de données. Vous pouvez utiliser un outil de Visual Web Developer Express ou Visual Studio 2008 pour créer ces classes.

Pour créer une classe pour la table BookReviews

  1. Si le site Web ne possède pas déjà un dossier App_Code, dans l'Explorateur de solutions, cliquez avec le bouton droit sur le projet, cliquez sur Ajouter le dossier ASP.NET, puis sur App_Code.

  2. Cliquez avec le bouton droit sur le dossier App_Code, puis cliquez sur Ajouter un nouvel élément.

  3. Sous Modèles installés, sélectionnez Classes LINQ to SQL, renommez le fichier Reviews.dbml, puis cliquez Ajouter.

    La fenêtre du Concepteur Objet/Relationnel s'affiche.

  4. Dans l'Explorateur de serveurs, faites glisser la table BookReviews dans la fenêtre Concepteur Objet/Relationnel.

    La table BookReviews et ses colonnes sont représentées en tant qu'entité nommée BookReview dans la fenêtre du concepteur.

  5. Enregistrez le fichier Reviews.dbml.

  6. Dans l'Explorateur de solutions, ouvrez le fichier Reviews.designer.cs ou Reviews.designer.vb.

    L'entité a maintenant des classes nommées ReviewsDataContext et BookReview. Les attributs de colonne pour toutes les colonnes sont marqués par UpdateCheck=UpdateCheck.Never. Toutefois, l'attribut de colonne pour la colonne d'horodatage est marqué par IsVersion=true.

  7. Fermez le fichier Reviews.dbml.

Création et configuration d'un contrôle LinqDataSource

Vous avez maintenant une table de base de données et des classes qui représentent des entités de base de données. Vous pouvez utiliser un contrôle LinqDataSource sur une page Web ASP.NET pour gérer des données à afficher et mettre à jour.

Pour créer et configurer un contrôle LinqDataSource

  1. Dans Visual Studio, créez une page Web ASP.NET et basculez en mode Source.

  2. À partir de l'onglet Données de la Boîte à outils, faites glisser un contrôle LinqDataSource et déposez-le dans l'élément form de la page Web.

    Vous pouvez conserver à la propriété ID la valeur LinqDataSource1.

  3. Affectez à la propriété ContextTypeName la valeur ReviewsDataContext.

  4. Affectez à la propriété TableName la valeur BookReviews.

  5. Affectez aux propriétés EnableUpdate et EnableDelete la valeur true.

    L'exemple suivant montre le code déclaratif pour le contrôle LinqDataSource.

    <asp:LinqDataSource 
      ContextTypeName="ReviewsDataContext" 
      TableName="BookReviews" 
      EnableUpdate="true" 
      EnableDelete="true" 
      ID="LinqDataSource1" 
      >
    </asp:LinqDataSource>
    

Ajout d'un contrôle pour afficher et mettre à jour les données

Vous pouvez à présent ajouter un contrôle DetailsView et le lier au contrôle LinqDataSource. Le contrôle DetailsView permet aux utilisateurs d'afficher et mettre à jour des données gérées par le contrôle LinqDataSource.

Pour lier un contrôle DetailsView aux données à partir d'un contrôle LinqDataSource.

  1. Sous l'onglet Données de la Boîte à outils, double-cliquez sur le contrôle DetailsView pour l'ajouter à la page.

    Vous pouvez conserver à la propriété ID la valeur DetailsView1.

  2. Affectez à la propriété DataSourceID la valeur LinqDataSource1.

  3. Affectez à la propriété DataKeyNames la valeur BookID.

    Vous devez définir la propriété DataKeyNames si vous souhaitez utiliser le contrôle DetailsView pour mettre à jour ou supprimer des données.

  4. Affectez à la propriété AllowPaging la valeur true.

  5. Affectez aux propriétés AutoGenerateEditButton et AutoGenerateDeleteButton la valeur true.

    L'exemple suivant montre le balisage déclaratif.

    <asp:DetailsView 
      DataSourceID="LinqDataSource1" 
      DataKeyNames="BookID" 
      AutoGenerateEditButton="true"
      AutoGenerateDeleteButton="true"
      AllowPaging="true" 
      ID="DetailsView1" 
      >
    </asp:DetailsView>
    

    Dans la base de données BookReviews, les BookID et les colonnes d'horodatage sont définies automatiquement par la base de données. Les utilisateurs ne peuvent pas modifier leurs valeurs.

  6. Enregistrez les modifications apportées.

  7. Appuyez sur CTRL+F5 pour afficher la page dans le navigateur.

    Le contrôle DetailsView affiche les colonnes pour les enregistrements actifs de la table BookReviews.

  8. Fermez le navigateur.

Vérification des conflits de données éventuels

Pour voir comment la colonne d'horodatage empêche les mises à jour lorsque les données ont changé, vous pouvez exécuter un test. Vous sélectionnerez un enregistrement à mettre à jour dans une page Web mais vous changerez le même enregistrement à l'extérieur de la page Web. En envoyant la mise à jour à travers la page Web, le contrôle LinqDataSource la bloquera.

Pour tester l'intégrité des données

  1. Appuyez sur CTRL+F5 pour afficher la page dans le navigateur.

  2. Sélectionnez un enregistrement puis cliquez sur le lien Modification. Ne mettez pas encore à jour l'enregistrement.

  3. Dans l'Explorateur de serveurs, cliquez avec le bouton droit sur la table BookReviews et cliquez sur Afficher les données de la table.

  4. Modifiez une valeur dans le même enregistrement que vous avez ouvert dans le navigateur Web.

  5. Fermez la fenêtre pour écrire la modification dans la base de données.

    Lorsque la modification est enregistrée, la colonne d'horodatage de l'enregistrement est mise à jour automatiquement par SQL Server.

  6. Dans le navigateur Web, modifiez une valeur dans l'enregistrement à mettre à jour.

  7. Cliquez sur le lien Mise à jour.

    Vous verrez un message d'erreur vous informant que la ligne a été modifiée. L'horodatage enregistré dans la page ne correspond pas à l'horodatage de l'enregistrement dans la base de données.

    Si vous souhaitez exécuter une action lorsque cette erreur est affichée, vous pouvez créer un gestionnaire pour l'événement Updating.

Étapes suivantes

Dans cette procédure pas à pas, vous avez vu comment optimiser des contrôles de l'intégrité des données lorsque vous utilisez le contrôle LinqDataSource. Vous pouvez également exploiter les avantages des fonctions du contrôle LinqDataSource des façons indiquées ci-dessous.

Voir aussi

Concepts

Vue d'ensemble du contrôle serveur Web LinqDataSource

Référence

LinqDataSource