Codificar un administrador de conexiones personalizado
Una vez creada una clase que hereda de la clase base ConnectionManagerBase y aplicado el atributo DtsConnectionAttribute a la clase, debe invalidar la implementación de las propiedades y métodos de la clase base para proporcionar su funcionalidad personalizada.
Para obtener ejemplos funcionales de administradores de conexiones personalizados, vea los ejemplos de Integration Services en Codeplex. Los ejemplos de código mostrados en este tema se deducen del ejemplo de administrador de conexiones personalizado de SQL Server.
Nota
Muchas de las tareas, orígenes y destinos que se han incluido en Integration Services se usan únicamente con tipos específicos de administradores de conexiones integrados. Por consiguiente, estos ejemplos no se pueden probar con las tareas y componentes integrados.
Configurar el administrador de conexiones
Establecer la propiedad ConnectionString
La propiedad ConnectionString es una propiedad importante y la única propiedad para un administrador de conexiones personalizado. El administrador de conexiones usa el valor de esta propiedad para conectar al origen de datos externo. Si combina varias propiedades, como nombre de servidor y nombre de base de datos, para crear la cadena de conexión, puede usar una función auxiliar para ensamblar la cadena reemplazando ciertos valores en una plantilla de cadena de conexión con el nuevo valor que proporciona el usuario. En el ejemplo de código siguiente se muestra una implementación de la propiedad ConnectionString que confía en una función auxiliar para ensamblar la cadena.
' Default values.
Private _serverName As String = "(local)"
Private _databaseName As String = "AdventureWorks2008R2"
Private _connectionString As String = String.Empty
Private Const CONNECTIONSTRING_TEMPLATE As String = _
"Data Source=<servername>;Initial Catalog=<databasename>;Integrated Security=SSPI"
Public Property ServerName() As String
Get
Return _serverName
End Get
Set(ByVal value As String)
_serverName = value
End Set
End Property
Public Property DatabaseName() As String
Get
Return _databaseName
End Get
Set(ByVal value As String)
_databaseName = value
End Set
End Property
Public Overrides Property ConnectionString() As String
Get
UpdateConnectionString()
Return _connectionString
End Get
Set(ByVal value As String)
_connectionString = value
End Set
End Property
Private Sub UpdateConnectionString()
Dim temporaryString As String = CONNECTIONSTRING_TEMPLATE
If Not String.IsNullOrEmpty(_serverName) Then
temporaryString = temporaryString.Replace("<servername>", _serverName)
End If
If Not String.IsNullOrEmpty(_databaseName) Then
temporaryString = temporaryString.Replace("<databasename>", _databaseName)
End If
_connectionString = temporaryString
End Sub
// Default values.
private string _serverName = "(local)";
private string _databaseName = "AdventureWorks2008R2";
private string _connectionString = String.Empty;
private const string CONNECTIONSTRING_TEMPLATE = "Data Source=<servername>;Initial Catalog=<databasename>;Integrated Security=SSPI";
public string ServerName
{
get
{
return _serverName;
}
set
{
_serverName = value;
}
}
public string DatabaseName
{
get
{
return _databaseName;
}
set
{
_databaseName = value;
}
}
public override string ConnectionString
{
get
{
UpdateConnectionString();
return _connectionString;
}
set
{
_connectionString = value;
}
}
private void UpdateConnectionString()
{
string temporaryString = CONNECTIONSTRING_TEMPLATE;
if (!String.IsNullOrEmpty(_serverName))
{
temporaryString = temporaryString.Replace("<servername>", _serverName);
}
if (!String.IsNullOrEmpty(_databaseName))
{
temporaryString = temporaryString.Replace("<databasename>", _databaseName);
}
_connectionString = temporaryString;
}
Validar el administrador de conexiones
Invalide el método Validate para asegurarse de que el administrador de conexiones se ha configurado correctamente. Como mínimo, debería validar el formato de la cadena de conexión y asegurarse de que se han proporcionado valores para todos los argumentos. La ejecución no puede continuar hasta que el administrador de conexiones no devuelva Success en el método Validate.
En el siguiente ejemplo de código se muestra una implementación de Validate que asegura que el usuario ha especificado un nombre de servidor para la conexión.
Public Overrides Function Validate(ByVal infoEvents As Microsoft.SqlServer.Dts.Runtime.IDTSInfoEvents) As Microsoft.SqlServer.Dts.Runtime.DTSExecResult
If String.IsNullOrEmpty(_serverName) Then
infoEvents.FireError(0, "SqlConnectionManager", "No server name specified", String.Empty, 0)
Return DTSExecResult.Failure
Else
Return DTSExecResult.Success
End If
End Function
public override Microsoft.SqlServer.Dts.Runtime.DTSExecResult Validate(Microsoft.SqlServer.Dts.Runtime.IDTSInfoEvents infoEvents)
{
if (String.IsNullOrEmpty(_serverName))
{
infoEvents.FireError(0, "SqlConnectionManager", "No server name specified", String.Empty, 0);
return DTSExecResult.Failure;
}
else
{
return DTSExecResult.Success;
}
}
Conservar el administrador de conexiones
Normalmente, no tiene que implementar la persistencia personalizada para un administrador de conexiones. Solo se requiere la persistencia personalizada cuando las propiedades de un objeto usan tipos de datos complejos. Para obtener más información, vea Desarrollar objetos personalizados para Integration Services.
Trabajar con el origen de datos externos
Los métodos que permiten conectar a un origen de datos externo son los métodos más importantes de un administrador de conexiones personalizado. Se llama varias veces a los métodos ReleaseConnection y AcquireConnection durante tiempo de diseño y tiempo de ejecución.
Adquirir la conexión
Debe decidir el tipo de objeto que es el adecuado para devolver el método AcquireConnection de su administrador de conexiones personalizado. Por ejemplo, un administrador de conexiones de archivos devuelve únicamente una cadena que contiene una ruta y nombre de archivo, mientras que una conexión ADO.NET devuelve un objeto de conexión administrado que ya está abierto. Un administrador de conexiones OLE DB devuelve un objeto de conexión OLE DB nativo que el código administrado no puede utilizar. El administrador de conexiones SQL Server personalizado, del que se toman los fragmentos de código en este tema, devuelve un objeto SqlConnection abierto.
Los usuarios de su administrador de conexiones necesitan conocer de antemano el tipo de objeto que se espera, para que puedan convertir el objeto devuelto al tipo adecuado y obtener acceso sus métodos y propiedades.
Public Overrides Function AcquireConnection(ByVal txn As Object) As Object
Dim sqlConnection As New SqlConnection
UpdateConnectionString()
With sqlConnection
.ConnectionString = _connectionString
.Open()
End With
Return sqlConnection
End Function
public override object AcquireConnection(object txn)
{
SqlConnection sqlConnection = new SqlConnection();
UpdateConnectionString();
{
sqlConnection.ConnectionString = _connectionString;
sqlConnection.Open();
}
return sqlConnection;
}
Liberar la conexión
Las medidas que toma en el método ReleaseConnection dependen del tipo de objeto devuelto del método AcquireConnection. Si hay un objeto de conexión abierto, debería cerrarlo y liberar cualquier recurso que se esté utilizando. Si AcquireConnection devuelve únicamente un valor de cadena, ya no se necesita realizar ninguna acción.
Public Overrides Sub ReleaseConnection(ByVal connection As Object)
Dim sqlConnection As SqlConnection
sqlConnection = DirectCast(connection, SqlConnection)
If sqlConnection.State <> ConnectionState.Closed Then
sqlConnection.Close()
End If
End Sub
public override void ReleaseConnection(object connection)
{
SqlConnection sqlConnection;
sqlConnection = (SqlConnection)connection;
if (sqlConnection.State != ConnectionState.Closed)
sqlConnection.Close();
}
|