Connecter une application ASP.NET à Azure SQL Database

Effectué

Vous pouvez vous connecter de diverses façons à des bases de données au sein du service Azure SQL Database à partir d’une application. Pour les applications .NET, vous pouvez utiliser la bibliothèque System.Data.SqlClient.

L’application web pour l’université doit extraire et afficher les données que vous avez chargées sur votre base de données SQL. Dans cette unité, vous allez apprendre à vous connecter à une base de données à partir d’une application web, puis à utiliser la bibliothèque System.Data.SqlClient pour traiter les données.

Vue d’ensemble de la bibliothèque System.Data.SqlClient

La bibliothèque System.Data.SqlClient est une collection de types et méthodes que vous pouvez utiliser pour vous connecter à une base de données SQL Server qui s’exécute en local ou dans le cloud sur SQL Database. La bibliothèque offre une interface généralisée pour la récupération et la gestion des données. Vous pouvez utiliser la bibliothèque System.Data.SqlClient pour exécuter des commandes Transact-SQL (T-SQL) et des opérations transactionnelles et récupérer des données. Vous pouvez paramétrer ces opérations pour éviter les problèmes liés aux attaques par injection de code SQL. Si une opération échoue, la bibliothèque System.Data.SqlClient fournit les informations d’erreur par le biais de classes d’exception et d’erreur spécialisées. Vous gérez ces exceptions comme n’importe quel autre type d’exception dans une application .NET.

La bibliothèque System.Data.SqlClient est disponible dans le package NuGet System.Data.SqlClient.

Se connecter à une base de données unique

Vous créez une connexion de base de données en utilisant un objet SqlConnection. Vous fournissez une chaîne de connexion qui spécifie le nom et l’emplacement de la base de données, les informations d’identification à utiliser et d’autres paramètres liés à la connexion. Voici ce à quoi une chaîne de connexion à une base de données unique ressemble :

Server=tcp:myserver.database.windows.net,1433;Initial Catalog=mydatabase;Persist Security Info=False;User ID=myusername;Password=mypassword;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;

Vous pouvez trouver la chaîne de connexion de votre base de données unique dans la page Chaînes de connexion de votre base de données dans le portail Azure.

L’exemple de code suivant montre comment créer un objet SqlConnection :

using System.Data.SqlClient;

...

string connectionString = "Server=tcp:myserver.database.windows.net,...";
SqlConnection con = new SqlConnection(connectionString);

La connexion de base de données n’est pas établie tant que vous n’avez pas ouvert la connexion. En règle générale, vous ouvrez la connexion juste avant d’exécuter une commande ou requête T-SQL.

con.Open();

Certaines bases de données prennent uniquement en charge un nombre fini de connexions simultanées. Ainsi, une fois que vous avez fini d’exécuter une commande et récupéré les résultats, il est recommandé de fermer la connexion et de libérer toutes les ressources qui ont été réservées.

con.Close();

Une autre approche courante consiste à créer la connexion dans une instruction using. Cette stratégie ferme automatiquement la connexion lorsque l'instruction using est terminée. Toutefois, vous pouvez également appeler explicitement la méthode Close.

using (SqlConnection con = new SqlConnection(connectionString))
{
    // Open and Use the connection here
    con.Open();
    ...
}
// Connection is now closed

Définir une commande ou requête T-SQL

Créez un objet SqlCommand pour spécifier une commande ou requête T-SQL à exécuter. L’exemple suivant montre une instruction T-SQL DELETE qui supprime les lignes d’un client donné dans la table nommée dbo.Orders. Vous pouvez paramétrer les commandes. Cet exemple utilise un paramètre nommé CustID pour la valeur CustomerID . La ligne qui affecte à la propriété CommandType de l’objet SqlCommand la valeur Text indique que la commande est une instruction T-SQL. Vous pouvez également exécuter une procédure stockée plutôt qu’une instruction T-SQL. Dans ce cas, vous affectez CommandType à StoredProcedure.

SqlCommand deleteOrdersForCustomer = new SqlCommand("DELETE FROM Orders WHERE CustomerID = @custID", con);
deleteOrdersForCustomer.CommandType = CommandType.Text;
string customerID = <prompt the user for a customer to delete>;
deleteOrdersForCustomer.Parameters.Add(new SqlParameter("custID", customerID));

Le paramètre final du constructeur SqlCommand indiqué dans cet exemple est la connexion utilisée pour exécuter la commande.

L’exemple suivant montre une requête qui joint les tables dbo.Customers et dbo.Orders pour produire la liste des noms de clients et de leurs commandes.

SqlCommand queryCmd = new SqlCommand(
                    @"SELECT c.FirstName, c.LastName, o.OrderID
                      FROM Customers c JOIN Orders o
                      ON c.CustomerID = o.CustomerID", con);
queryCmd.CommandType = CommandType.Text;

Exécuter une commande

Si votre objet SqlCommand référence une instruction T-SQL qui ne retourne pas de jeu de résultats, vous exécutez la commande avec la méthode ExecuteNonQuery. Si la commande réussit, elle retourne le nombre de lignes affectées par l’opération. L’exemple suivant montre comment exécuter la commande deleteOrdersForCustomer présentée plus tôt.

int numDeleted = deleteOrdersForCustomer.ExecuteNonQuery();

Si vous pensez que la commande a besoin d’un certain temps pour s’exécuter, vous pouvez utiliser la méthode ExecuteNonQueryAsync pour effectuer l’opération de façon asynchrone.

Exécuter une requête et extraire des données

Si votre SqlCommand contient une instruction T-SQL SELECT, vous l’exécutez avec la méthode ExecuteReader. Cette méthode retourne un objet SqlDataReader que vous pouvez utiliser pour itérer au sein des résultats et traiter chaque ligne à son tour. Vous récupérez les données auprès d’un objet SqlReader avec la méthode Read. Cette méthode retourne true si une ligne est trouvée et false s’il n’y a pas d’autres lignes à lire. Une fois qu’une ligne est lue, les données de cette ligne sont disponibles dans les champs de l’objet SqlReader. Chaque champ partage le même nom que la colonne correspondante dans l’instruction SELECT d’origine. Toutefois, les données de chaque champ sont extraites en tant que object non typé, si bien que vous devez le convertir en type approprié pour pouvoir l’utiliser. Le code suivant montre comment exécuter la commande queryCmd illustrée précédemment, puis extraire les données une ligne à la fois.

SqlDataReader rdr = queryCmd.ExecuteReader();

// Read the data a row at a time
while (rdr.Read())
{
    string firstName = rdr["FirstName"].ToString();
    string lastName = rdr["LastName"].ToString();
    int orderID = Convert.ToInt32(rdr["OrderID"]);

    // Process the data
    ...
}

Gérer les exceptions et les erreurs

Des exceptions et des erreurs peuvent se produire pour différentes raisons lorsque vous utilisez une base de données. Par exemple, vous essayez peut-être d’accéder à une table qui n’existe plus. Vous pouvez intercepter les erreurs T-SQL en utilisant le type SqlException.

Il existe plusieurs événements ou problèmes dans la base de données susceptibles de déclencher une exception. Un objet SqlException a une propriété nommée Errors qui contient une collection d’objets SqlError. Ces objets fournissent les détails de chaque erreur. L’exemple suivant montre comment intercepter une SqlException et traiter les erreurs qu’elle contient.

...
using (SqlConnection con = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand("DELETE FROM ...", con);
    try
    {
        con.Open();
        command.ExecuteNonQuery();
    }
    catch (SqlException ex)
    {
        for (int i = 0; i < ex.Errors.Count; i++)
        {
            Console.WriteLine($"Index # {i} Error: {ex.Errors[i].ToString()}");
        }
    }
}