Exporter (0) Imprimer
Développer tout

Procédure : Connexion à la base de données SQL Azure à l'aide d'ADO.NET

Mis à jour: novembre 2014

Utilisez ADO.NET pour se connecter à la base de données SQL Microsoft Azure. Contrairement à une connexion locale, vous devez tenir compte de la limitation ou d'autres erreurs de service qui peuvent mettre fin à une connexion ou bloquer temporairement les nouvelles connexions. Cette condition est appelée « erreur temporaire ». Pour gérer les erreurs temporaires, implémentez une stratégie de nouvelle tentative. Lors de la connexion à la base de données SQL Azure, le bloc applicatif de gestion d'erreurs transitoires, inclus dans la version d'Enterprise Library 6 datant d'avril 2013, dispose de stratégies de détection afin d'identifier les conditions d'erreurs temporaires. Pour plus d'informations, consultez Procédure : Connexion fiable à une base de données SQL Azure.

La différence entre une connexion locale et une connexion ADO.NET à la base de données SQL Azure est que cette dernière bénéficie d'une stratégie de nouvelle tentative et d'une classe ReliableSqlConnection. La fonctionnalité de nouvelle tentative et la classe ReliableSqlConnection font partie du Bloc applicatif de gestion d'erreurs transitoires.

Pour installer le bloc applicatif de gestion d'erreurs temporaires, consultez How to install Transient Fault Handling Application Block 6.0.

À l'aide du bloc applicatif de gestion d'erreurs temporaires 6.0

  1. Définissez une stratégie de nouvelle tentative Interruption exponentielle pour la limitation de la base de données SQL Azure. Ce type de stratégie interrompra de façon appropriée la charge sur le service.

    ExponentialBackoff exponentialBackoffStrategy = 
                    new ExponentialBackoff("exponentialBackoffStrategy",
                        retryCount,
                        TimeSpan.FromMilliseconds(minBackoffDelayMilliseconds), 
                        TimeSpan.FromMilliseconds(maxBackoffDelayMilliseconds),
                        TimeSpan.FromMilliseconds(deltaBackoffMilliseconds));
    
    
  2. Définissez une stratégie par défaut sur Interruption exponentielle.

    RetryManager manager = new RetryManager(new List<RetryStrategy>
    {
    exponentialBackoffStrategy 
    }, 
    " exponentialBackoffStrategy");
    
    
  3. Définissez un composant RetryManager par défaut. Un composant RetryManager fournit une fonctionnalité de nouvelle tentative.

    RetryManager.SetDefault(manager);
    
    
  4. Définissez une règle de nouvelle tentative de connexion SQL par défaut et une règle de nouvelle tentative de commande SQL. Une stratégie fournit un mécanisme de nouvelle tentative pour les actions non fiables et les conditions temporaires.

    RetryPolicy retryConnectionPolicy = manager.GetDefaultSqlConnectionRetryPolicy();
    RetryPolicy retryCommandPolicy = manager.GetDefaultSqlCommandRetryPolicy();
    
    
  5. Créez une fonction qui va effectuer une nouvelle tentative de connexion en utilisant une classe ReliableSqlConnection.

    retryConnectionPolicy.ExecuteAction(() =>
                {
      using (ReliableSqlConnection connection = new   
      ReliableSqlConnection(builder.ConnectionString)) …
    
    
  6. Créez une fonction qui va réessayer la commande en appelant ExecuteCommand() à partir de la classe ReliableSqlConnection.

    retryCommandPolicy.ExecuteAction(() =>
    {
    using (IDataReader reader = connection.ExecuteCommand<IDataReader>(command)) …
    
    

static void Main(string[] args)
        {
            //NOTE: Use appropriate exception handling in a production application.

            //Replace
            //  builder["Server"]: {servername} = Your Azure SQL Database server name
            //  builder["User ID"]: {username}@{servername} = Your Azure SQL Database user name and server name
            //  builder["Password"]: {password} = Your Azure SQL Database password

            System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
            builder["Server"] = "{servername}";
            builder["User ID"] = "{username}@{servername}";
            builder["Password"] = "{password}";

            builder["Database"] = "AdventureWorks2012";
            builder["Trusted_Connection"] = false;
            builder["Integrated Security"] = false;
            builder["Encrypt"] = true;

            //1. Define an Exponential Backoff retry strategy for Azure SQL Database throttling (ExponentialBackoff Class). An exponential back-off strategy will gracefully back off the load on the service.
            int retryCount = 4;
            int minBackoffDelayMilliseconds = 2000;
            int maxBackoffDelayMilliseconds = 8000;
            int deltaBackoffMilliseconds = 2000;

            ExponentialBackoff exponentialBackoffStrategy = 
                new ExponentialBackoff("exponentialBackoffStrategy",
                    retryCount,
                    TimeSpan.FromMilliseconds(minBackoffDelayMilliseconds), 
                    TimeSpan.FromMilliseconds(maxBackoffDelayMilliseconds),
                    TimeSpan.FromMilliseconds(deltaBackoffMilliseconds));

            //2. Set a default strategy to Exponential Backoff.
            RetryManager manager = new RetryManager(new List<RetryStrategy>
            {  
                exponentialBackoffStrategy 
            }, "exponentialBackoffStrategy");

            //3. Set a default Retry Manager. A RetryManager provides retry functionality, or if you are using declarative configuration, you can invoke the RetryPolicyFactory.CreateDefault
            RetryManager.SetDefault(manager);

            //4. Define a default SQL Connection retry policy and SQL Command retry policy. A policy provides a retry mechanism for unreliable actions and transient conditions.
            RetryPolicy retryConnectionPolicy = manager.GetDefaultSqlConnectionRetryPolicy();
            RetryPolicy retryCommandPolicy = manager.GetDefaultSqlCommandRetryPolicy();

            //5. Create a function that will retry the connection using a ReliableSqlConnection.
            retryConnectionPolicy.ExecuteAction(() =>
            {
                using (ReliableSqlConnection connection = new ReliableSqlConnection(builder.ConnectionString))
                {
                    connection.Open();

                    IDbCommand command = connection.CreateCommand();
                    command.CommandText = "SELECT Name FROM Production.Product";

                    //6. Create a function that will retry the command calling ExecuteCommand() from the ReliableSqlConnection
                    retryCommandPolicy.ExecuteAction(() =>
                    {
                        using (IDataReader reader = connection.ExecuteCommand<IDataReader>(command))
                        {
                            while (reader.Read())
                            {
                                string name = reader.GetString(0);

                                Console.WriteLine(name);
                            }
                        }
                    });                  
                }
            });

            Console.ReadLine();
        }

Lorsque vous vous connectez à une base de données dans base de données SQL Azure avec une application ADO.NET, considérez les points suivants :

  • Évitez les attaques par injection en ayant recours à la classe SqlConnectionStringBuilder. Elle est disponible dans le .NET Framework pour simplifier la création de la chaîne de connexion. Pour plus d'informations, consultez Générateurs de chaînes de connexion (ADO.NET).

  • Une chaîne de connexion constitue une vulnérabilité potentielle. Pour plus d'informations sur la protection de la chaîne de connexion, consultez Protection des informations de connexion (ADO.NET).

  • Chiffrez la connexion, en particulier lorsque vous vous connectez à base de données SQL Azure via Internet, afin qu'aucune attaque de l'intercepteur ( « man in the middle » ) soit possible. Affectez à la propriété de connexion Encrypt la valeur True (Encrypt = True). Affectez à la propriété de connexion TrustServerCertificate la valeur False (TrustServerCertificate = False).

  • Pour connaître les considérations générales relatives à la connexion aux bases de données dans base de données SQL Azure, consultez les articles Instructions pour la connexion à Base de données SQL Azure et Résilience de connexion inactive.

  • Lorsque vous ouvrez une connexion base de données SQL Azure, définissez le délai de connexion à 30 secondes.

Voir aussi

Afficher:
© 2015 Microsoft