Creando cadenas de conexión para SQL Server


La cadena de conexión de SQL Server, varía según la ubicación (local, remota o en la nube) del servidor, así como, según el método de autenticación del usuario. Éste último, ha tenido varios agregados al integrarse con el Directorio Activo y su extensión en la nube, incluyendo Microsoft Entra.

Es interesante que la biblioteca Microsoft.Data.SqlClient expone una clase, SqlConnectionStringBuilder, que nos permite generar la cadena de conexión pasándole los parámetros requeridos.

En este ejemplo, les muestro una clase, definida en una biblioteca de clases, que permite generar cadenas de conexión, encapsulando la funcionalidad

SqlConnStringDefinition

Como se ve, expone como propiedades, los distintos elementos necesarios u opcionales, requeridos para definir una cadena de conexión.

A su vez, la propiedad ConnectionString genera la misma, al retornarla, según este código:

public string ConnectionString
{
   get
   {
      SqlAuthenticationMethod method = (SqlAuthenticationMethod)Enum.Parse(typeof(SqlAuthenticationMethod), AuthenticationMethod);
      SqlConnectionStringBuilder sqlConnectionStringBuilder = new SqlConnectionStringBuilder();
      sqlConnectionStringBuilder.DataSource = Server;
      sqlConnectionStringBuilder.InitialCatalog = Database ?? "master";
      sqlConnectionStringBuilder.Authentication = method;
      sqlConnectionStringBuilder.MultipleActiveResultSets = MultipleActiveResultSets;
      sqlConnectionStringBuilder.Encrypt = Encrypt;
      sqlConnectionStringBuilder.TrustServerCertificate = TrustServerCertificate;
      sqlConnectionStringBuilder.ApplicationName = ApplicationName ?? "No name";
      switch(method)
      {
         case SqlAuthenticationMethod.ActiveDirectoryIntegrated:
            sqlConnectionStringBuilder.IntegratedSecurity = true;
            break;
 
         case SqlAuthenticationMethod.ActiveDirectoryInteractive:
            break;
 
         case SqlAuthenticationMethod.ActiveDirectoryPassword:
         case SqlAuthenticationMethod.SqlPassword:
            sqlConnectionStringBuilder.UserID = Username;
            sqlConnectionStringBuilder.Password = Password;
            break;
 
         case SqlAuthenticationMethod.ActiveDirectoryServicePrincipal:
         case SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow:
         case SqlAuthenticationMethod.ActiveDirectoryManagedIdentity:
         case SqlAuthenticationMethod.ActiveDirectoryMSI:
         case SqlAuthenticationMethod.ActiveDirectoryDefault:
         case SqlAuthenticationMethod.NotSpecified:
            break;
 
         default:
            break;
      }
      return sqlConnectionStringBuilder.ToString();
   }
}

El proceso inverso, esto es obtener un objeto SqlConnectionStringBuilder a partir de una cadena de conexión, lo realiza el método BuildFromString

public static SQLConStringDefinition BuildFromString(String connectionString)
{
   SqlConnectionStringBuilder sqlConnectionStringBuilder = new SqlConnectionStringBuilder(connectionString);
   SQLConStringDefinition conStringDefinition = new SQLConStringDefinition()
   {
      Server = sqlConnectionStringBuilder.DataSource,
      Database = sqlConnectionStringBuilder.InitialCatalog,
      AuthenticationMethod = sqlConnectionStringBuilder.Authentication.ToString(),
      ApplicationName = sqlConnectionStringBuilder.ApplicationName,
      Username = sqlConnectionStringBuilder.UserID,
      Password = sqlConnectionStringBuilder.Password,
      TrustServerCertificate = sqlConnectionStringBuilder.TrustServerCertificate,
      Encrypt = sqlConnectionStringBuilder.Encrypt,
      MultipleActiveResultSets = sqlConnectionStringBuilder.MultipleActiveResultSets
   };
   return conStringDefinition;
}

Finalmente, la clase expone un evento, RequireCredentials, que se lanza cuando cambia la condición de requerir (o no), usuario y contraseña.

Ese evento se lanza al cambiar el valor de la propiedad AuthenticationMethod

public string AuthenticationMethod
{
   get => authenticationMethod; set
   {
      authenticationMethod = value;
      SqlAuthenticationMethod method = (SqlAuthenticationMethod)Enum.Parse(typeof(SqlAuthenticationMethod), AuthenticationMethod);
      switch(method)
      {
         case SqlAuthenticationMethod.ActiveDirectoryPassword:
         case SqlAuthenticationMethod.SqlPassword:
            CallRequireCredentials(true);
            break;
 
         case SqlAuthenticationMethod.ActiveDirectoryIntegrated:
         case SqlAuthenticationMethod.ActiveDirectoryInteractive:
         case SqlAuthenticationMethod.ActiveDirectoryServicePrincipal:
         case SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow:
         case SqlAuthenticationMethod.ActiveDirectoryManagedIdentity:
         case SqlAuthenticationMethod.ActiveDirectoryMSI:
         case SqlAuthenticationMethod.ActiveDirectoryDefault:
         case SqlAuthenticationMethod.NotSpecified:
            CallRequireCredentials(false);
            break;
 
         default:
            CallRequireCredentials(false);
            break;
      }
   }
}

Nota: La idea de tenerlo como una clase en una biblioteca de clases, es para poder utilizarlo desde distintos clientes (Windows Forms, WPF, UWP, etc.)

Cosa que haremos en próximas entregas 🙂

De paso, mis deseos de un próspero y venturoso 2024 para todos.

Windows Forms IU

Un comentario en “Creando cadenas de conexión para SQL Server”

Comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.