Exercice - Connecter une application ASP.NET à Azure SQL Database
Votre base de données est créée. Nous pouvons maintenant configurer et déployer une application web utilisable par les conseillers pédagogiques pour discuter des cours et des programmes d’étude avec les étudiants. L’application utilise la bibliothèque System.Data.SqlClient
pour récupérer et afficher les détails des leçons et modules qu’un étudiant doit réussir pour achever un cours.
Pour gagner en temps, nous utilisons une application web préexistante et vous montrons comment ajouter le code pour connecter cette application à votre base de données. Le diagramme suivant illustre les composants principaux de cette application :
Pour configurer l’application web, effectuez les étapes suivantes :
- Créer une classe qui contient le nom du cours, le titre du module et la séquence de chaque module dans la base de données.
- Créer une classe de contrôleur d’accès aux données qui extrait les informations de la base de données.
- Modifier le code derrière la page d’index dans l’application web, pour créer un objet contrôleur d’accès aux données et extraire les données.
- Modifier la page d’index pour afficher les données.
Déployer et exécuter l’application web préexistante
Remplacez votre répertoire de travail par le dossier
education
.cd ~/education
Exécutez les commandes suivantes pour générer et déployer l’application web initiale.
WEBAPPNAME=educationapp-$RANDOM az webapp up \ --resource-group <rgn>[Sandbox resource group]</rgn> \ --location centralus \ --sku F1 \ --name $WEBAPPNAME
Quand l’application web est déployée, la sortie présente une App_url avec l’URL du site web. Ouvrez ce site dans un nouvel onglet.
Vous voulez que l’application web affiche la liste des cours et les modules qui composent chaque cours. Actuellement, l’application ne récupère pas ou n’affiche pas ces données. Vous devez donc mettre à jour le code pour obtenir les données de la base de données et les afficher.
Ajouter du code à l’application web pour récupérer des données
Ajoutons maintenant le code à l’application qui va récupérer les données de cours dans la base de données.
Dans Cloud Shell, accédez au dossier
education/Models
.cd ~/education/Models
Ce dossier contient deux fichiers,
CoursesAndModules.cs
etDataAccessController.cs
.Utilisez l’éditeur de code pour ouvrir le fichier
CoursesAndModules.cs
.code CoursesAndModules.cs
Ce fichier contient une classe vide nommée
CoursesAndModules
.namespace CoursesWebApp.Models { public class CoursesAndModules { // TODO: Define the CourseName, ModuleTitle, and Sequence read-only properties // TODO: Create a constructor that initializes the fields behind the properties } }
Remplacez le commentaire
// TODO: Define the CourseName, ModuleTitle, and Sequence read-only properties
par le code suivant.public string CourseName { get; } public string ModuleTitle { get; } public int Sequence { get; }
Ce code définit un ensemble de champs en lecture seule contenant les données de chaque ligne affichée par l’application web.
Remplacez le commentaire
// TODO: Create a constructor that initializes the fields behind the properties
par le constructeur suivant.public CoursesAndModules(string courseName, string moduleTitle, int sequence) { this.CourseName = courseName; this.ModuleTitle = moduleTitle; this.Sequence = sequence; }
Ce constructeur remplit les champs avec les données à afficher. Le fichier complet doit contenir le code suivant.
namespace CoursesWebApp.Models { public class CoursesAndModules { public string CourseName { get; } public string ModuleTitle { get; } public int Sequence { get; } public CoursesAndModules(string courseName, string moduleTitle, int sequence) { this.CourseName = courseName; this.ModuleTitle = moduleTitle; this.Sequence = sequence; } } }
Enregistrez le fichier en appuyant sur Ctrl+S et fermez l’éditeur de code en appuyant sur Ctrl+Q.
Utilisez l’éditeur de code pour ouvrir le fichier
DataAccessController.cs
.code DataAccessController.cs
Ce fichier contient une classe nommée
DataAccessController
. Cette classe contient la logique d’accès aux données pour la connexion à la base de données et la récupération des données de cours et de modules. Elle remplit la liste des objetsCoursesAndModules
avec ces données.using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Threading.Tasks; namespace CoursesWebApp.Models { public class DataAccessController { // TODO: Add your connection string in the following statements private string connectionString = "<Azure SQL Database Connection String>"; // Retrieve all details of courses and their modules public IEnumerable<CoursesAndModules> GetAllCoursesAndModules() { List<CoursesAndModules> courseList = new List<CoursesAndModules>(); // TODO: Connect to the database //using () { // TODO: Specify the Transact-SQL query to run // TODO: Execute the query // TODO: Read the data a row at a time // TODO: Close the database connection } return courseList; } } }
Laissez l’éditeur de code ouvert et basculez vers le portail Azure.
Dans le menu du portail Azure, sélectionnez Bases de données SQL, puis sélectionnez votre base de données. La Base de données SQL pour coursedatabaseNNN s’affiche.
Dans le volet du menu de gauche, sous Paramètres, sélectionnez Chaînes de connexion. Copiez la chaîne de connexion ADO.NET dans le Presse-papiers.
Revenez à l’éditeur de code. Remplacez la valeur de la variable connectionString par la valeur copiée dans le Presse-papiers. Dans la chaîne de connexion, consultez le texte
User ID
avec la valeurazuresql
. Remplacez le texte{your_password}
par le mot de passe de ce compte.private string connectionString = "Server=tcp:courseservernnn.database.windows.net,1433;Initial Catalog=coursedatabasennn;Persist Security Info=False;User ID=azuresql;Password=<password>;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;";
Après le commentaire
//TODO: Connect to the database
, remplacez l’instructionusing
commentée par le code suivant.using (SqlConnection con = new SqlConnection(connectionString))
Ce code crée un objet
SqlConnection
qui se connecte à la base de données à l’aide de votre chaîne de connexion.Remplacez le commentaire
// TODO: Specify the Transact-SQL query to run
par les instructions suivantes.SqlCommand cmd = new SqlCommand( @"SELECT c.CourseName, m.ModuleTitle, s.ModuleSequence FROM dbo.Courses c JOIN dbo.StudyPlans s ON c.CourseID = s.CourseID JOIN dbo.Modules m ON m.ModuleCode = s.ModuleCode ORDER BY c.CourseName, s.ModuleSequence", con); cmd.CommandType = CommandType.Text;
L’objet
SqlCommand
contient une instruction Transact-SQL (T-SQL) qui récupère les données de tous les cours et modules. Il les associe à l’aide des informations incluses dans la tabledbo.StudyPlan
.Remplacez le commentaire
// TODO: Execute the query
par le code suivant.con.Open(); SqlDataReader rdr = cmd.ExecuteReader();
Ces instructions ouvrent la connexion à la base de données et exécutent l’instruction T-SQL. Vous pouvez utiliser l’objet
SqlDataReader
pour extraire les résultats ligne par ligne.Remplacez le commentaire
// TODO: Read the data a row at a time
par le bloc de code suivant.while (rdr.Read()) { string courseName = rdr["CourseName"].ToString(); string moduleTitle = rdr["ModuleTitle"].ToString(); int moduleSequence = Convert.ToInt32(rdr["ModuleSequence"]); CoursesAndModules course = new CoursesAndModules(courseName, moduleTitle, moduleSequence); courseList.Add(course); }
Ce bloc itère au sein des lignes renvoyées dans l’objet
SqlDataReader
. Le code extrait les données dans les champs de chaque ligne et les utilise pour remplir un nouvel objetCoursesAndModules
. Cet objet est alors ajouté à une liste.Remplacez le commentaire
// TODO: Close the database connection
par l’instruction suivante.con.Close();
Cette instruction ferme la connexion à la base de données et libère les ressources détenues.
La classe terminée doit contenir le code suivant, qui comprend la chaîne de connexion de votre base de données.
using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Threading.Tasks; namespace CoursesWebApp.Models { public class DataAccessController { // Add your connection string in the following statements private string connectionString = "Server=tcp:courseserver101.database.windows.net,1433;Initial Catalog=coursedatabase101;Persist Security Info=False;User ID=azuresql;Password=<password>;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"; // Retrieve all details of courses and their modules public IEnumerable<CoursesAndModules> GetAllCoursesAndModules() { List<CoursesAndModules> courseList = new List<CoursesAndModules>(); // Connect to the database using (SqlConnection con = new SqlConnection(connectionString)) { // Specify the Transact-SQL query to run SqlCommand cmd = new SqlCommand( @"SELECT c.CourseName, m.ModuleTitle, s.ModuleSequence FROM dbo.Courses c JOIN dbo.StudyPlans s ON c.CourseID = s.CourseID JOIN dbo.Modules m ON m.ModuleCode = s.ModuleCode ORDER BY c.CourseName, s.ModuleSequence", con); cmd.CommandType = CommandType.Text; // Execute the query con.Open(); SqlDataReader rdr = cmd.ExecuteReader(); // Read the data a row at a time while (rdr.Read()) { string courseName = rdr["CourseName"].ToString(); string moduleTitle = rdr["ModuleTitle"].ToString(); int moduleSequence = Convert.ToInt32(rdr["ModuleSequence"]); CoursesAndModules course = new CoursesAndModules(courseName, moduleTitle, moduleSequence); courseList.Add(course); } // Close the database connection con.Close(); } return courseList; } } }
Enregistrez le fichier et fermez l’éditeur de code.
Ajouter du code à l’application web pour afficher les données
L’application peut maintenant récupérer les données de cours. À présent, mettez à jour l’application pour afficher les données à l’utilisateur.
Dans Cloud Shell, accédez au dossier
education/Pages
.cd ~/education/Pages
Ce dossier contient les pages .cshtml et les fichiers de code que l’application web utilise pour afficher des informations.
Utilisez l’éditeur de code pour ouvrir le fichier
Index.cshtml.cs
.code Index.cshtml.cs
Ce fichier contient le code que la page Index exécute quand elle s’affiche. Le code définit une classe
CoursesAndModulesModel
. La page Index utilise ce modèle pour afficher les détails des cours et des modules. Dans ce fichier, vous devez ajouter le code qui utilise un objetDataAccessController
pour extraire ces données.using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using CoursesWebApp.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace CoursesWebApp.Pages { public class CoursesAndModulesModel : PageModel { // TODO: Create a DataAccessController object // TODO: Create a collection for holding CoursesAndModules object public void OnGet() { // TODO: Retrieve the data using the DataAccessController object and populate the CoursesAndModules object } } }
Dans
Index.cshtml.cs
, remplacez le commentaire// TODO: Create a DataAccessController object
par le code suivant pour créer un objetDataAccessController
.DataAccessController dac = new DataAccessController();
Remplacez le commentaire
// TODO: Create a collection for holding CoursesAndModules object
par le code suivant.public List<CoursesAndModules> CoursesAndModules;
Dans la méthode
OnGet
, remplacez le commentaire// TODO: Retrieve the data using the DataAccessController object and populate the CoursesAndModules object
par le code suivant. Ce code utilise l’objetDataAccessController
pour remplir la liste avec les données de la base de données.CoursesAndModules = dac.GetAllCoursesAndModules().ToList();
Le fichier complété doit contenir le code suivant.
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using CoursesWebApp.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace CoursesWebApp.Pages { public class CoursesAndModulesModel : PageModel { // Create a DataAccessController object DataAccessController dac = new DataAccessController(); // Create a collection for holding CoursesAndModules object public List<CoursesAndModules> CoursesAndModules; public void OnGet() { // Retrieve the data using the DataAccessController object and populate the CoursesAndModules object CoursesAndModules = dac.GetAllCoursesAndModules().ToList(); } } }
Enregistrez le fichier et fermez l’éditeur de code.
Utilisez l’éditeur de code pour ouvrir le fichier
Index.cshtml
.code Index.cshtml
Ce fichier contient la logique d’affichage de la page Index. Il spécifie
CoursesAndModulesModel
comme source de données. Le code que nous avons ajouté crée et remplit ce modèle.La page utilise des données HTML pour afficher les données du modèle. Actuellement, la page affiche simplement les titres de table. Le corps de la table (
<tbody>
) est vide.<h2>Courses and Modules</h2> <div> <table class="table"> <thead> <tr> <th> Course Name </th> <th> Modules </th> <th> Sequence </th> </tr> </thead> <tbody> <!-- TODO: Display the data from the CoursesAndModules collection --> </tbody> </table> </div>
Remplacez le commentaire
<!-- TODO: Display the data from the CoursesAndModules collection --\>
par la balise suivante.@foreach(var courseAndModule in Model.CoursesAndModules) { <tr> <td> @Html.DisplayFor(courseName => courseAndModule.CourseName) </td> <td> @Html.DisplayFor(moduleTitle => courseAndModule.ModuleTitle) </td> <td> @Html.DisplayFor(sequence => courseAndModule.Sequence) </td> </tr> }
Ce code itère au sein des lignes dans le modèle, puis produit les données dans chaque champ.
Le fichier
Index.cshtml
complété doit contenir le code suivant.@page @model CoursesAndModulesModel @{ ViewData["Title"] = "Home page"; } <h2>Courses and Modules</h2> <div> <table class="table"> <thead> <tr> <th> Course Name </th> <th> Modules </th> <th> Sequence </th> </tr> </thead> <tbody> @foreach(var courseAndModule in Model.CoursesAndModules) { <tr> <td> @Html.DisplayFor(courseName => courseAndModule.CourseName) </td> <td> @Html.DisplayFor(moduleTitle => courseAndModule.ModuleTitle) </td> <td> @Html.DisplayFor(sequence => courseAndModule.Sequence) </td> </tr> } </tbody> </table> </div>
Enregistrez le fichier et fermez l’éditeur de code.
Déployer et tester l’application web mise à jour
Avec l’application entièrement configurée pour récupérer et présenter les données de cours à l’utilisateur, vous pouvez déployer la version mise à jour.
Dans Cloud Shell, revenez au dossier
education
.cd ~/education
Exécutez les commandes suivantes pour générer et déployer l’application web mise à jour.
az webapp up \ --resource-group <rgn>[Sandbox resource group]</rgn> \ --name $WEBAPPNAME
Une fois la nouvelle application web déployée, sélectionnez le lien de l’application. Elle doit maintenant présenter la liste des cours et des modules avec les données stockées dans la base de données.