Exportar (0) Imprimir
Expandir todo

Procedimiento: Conectarse a la Base de datos SQL de Azure con ADO.NET

Actualizado: noviembre de 2014

Use ADO.NET para conectarse a la base de datos SQL de Microsoft Azure. A diferencia de una conexión local, deberá tener en cuenta la limitación u otros errores de servicio que podrían terminar una conexión o bloquear temporalmente las conexiones nuevas. Esta condición se denomina error transitorio. Para administrar los errores transitorios, implemente una estrategia de reintento. Cuando se conecte a la Base de datos SQL de Azure, Transient Fault Handling Application Block, parte de Enterprise Library 6: abril de 2013, contiene estrategias de detección que identifican una condición de error transitorio. Para obtener más información, consulte Procedimiento: Conexión de confianza a una Base de datos SQL de Azure.

Una conexión ADO.NET a la base de datos de SQL Azure es similar a una conexión local, excepto que implementa una estrategia de reintento y usa una ReliableSqlConnection. La funcionalidad de reintento y la clase ReliableSqlConnection forman parte de Transient Fault Handling Application Block.

Para instalar Transient Fault Handling Application Block, vea How to install Transient Fault Handling Application Block 6.0.

Utilización de Transient Fault Handling Application Block 6.0

  1. Defina una estrategia de reintento de Tiempo de espera aleatorio exponencial para la limitación de la Base de datos SQL de Azure. Una estrategia de tiempo de espera aleatorio exponencial retrocederá correctamente la carga en el servicio.

    ExponentialBackoff exponentialBackoffStrategy = 
                    new ExponentialBackoff("exponentialBackoffStrategy",
                        retryCount,
                        TimeSpan.FromMilliseconds(minBackoffDelayMilliseconds), 
                        TimeSpan.FromMilliseconds(maxBackoffDelayMilliseconds),
                        TimeSpan.FromMilliseconds(deltaBackoffMilliseconds));
    
    
  2. Establezca una estrategia predeterminada para elTiempo de espera aleatorio exponencial.

    RetryManager manager = new RetryManager(new List<RetryStrategy>
    {
    exponentialBackoffStrategy 
    }, 
    " exponentialBackoffStrategy");
    
    
  3. Establezca un administrador de reintentos predeterminado. Un RetryManager proporciona la funcionalidad de reintento.

    RetryManager.SetDefault(manager);
    
    
  4. Defina una directiva de reintento de conexión SQL predeterminada y una directiva de reintento de comando SQL. Una directiva proporciona un mecanismo de reintento para acciones no confiables y condiciones transitorias.

    RetryPolicy retryConnectionPolicy = manager.GetDefaultSqlConnectionRetryPolicy();
    RetryPolicy retryCommandPolicy = manager.GetDefaultSqlCommandRetryPolicy();
    
    
  5. Cree una función que reintente la conexión usando ReliableSqlConnection.

    retryConnectionPolicy.ExecuteAction(() =>
                {
      using (ReliableSqlConnection connection = new   
      ReliableSqlConnection(builder.ConnectionString)) …
    
    
  6. Cree una función que reintente la llamada de comando ExecuteCommand() desde 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();
        }

Al conectarse a una base de datos en Base de datos SQL de Azure con una aplicación ADO.NET, tenga en cuenta lo siguiente:

  • Evite los ataques por inyección de código SQL usando la clase SqlConnectionStringBuilder. Está disponible en .NET Framework para simplificar la creación de la cadena de conexión. Para obtener más información, consulte Compiladores de cadenas de conexión (ADO.NET).

  • Una cadena de conexión presenta una vulnerabilidad potencial. Para obtener más información acerca de la protección de la cadena de conexión, vea Proteger la información de conexión (ADO.NET).

  • Cifre la conexión, especialmente cuando se conecte a Base de datos SQL de Azure a través de Internet, de manera que los ataques de tipo "Man in the middle" no sean posibles. Establezca la propiedad de conexión Encrypt en True (Encrypt = True). Establezca la propiedad de conexión TrustServerCertificate en False (TrustServerCertificate = False).

  • Para conocer las consideraciones generales sobre la conexión a bases de datos de Base de datos SQL de Azure, vea Instrucciones para conectar con Base de datos SQL de Azure y Technical Atricle – Idle Connection Resiliency.

  • Cuando abra una conexión con una Base de datos SQL de Azure, establezca el tiempo de espera de conexión en 30 segundos.

Vea también

Mostrar:
© 2015 Microsoft