Compartilhar via


Codificando um gerenciador de conexões personalizado

Após criar uma classe que herda da classe base ConnectionManagerBase e aplicar o atributo DtsConnectionAttribute à classe, você deverá substituir a implementação das propriedades e dos métodos da classe base para fornecer sua funcionalidade personalizada.

Para obter exemplos de gerenciadores de conexões personalizados, consulte os exemplos do Integration Services no Codeplex. Os exemplos de código mostrados neste tópico foram extraídos do exemplo do Gerenciador de Conexões Personalizado do SQL Server.

ObservaçãoObservação

A maioria das tarefas, fontes e destinos incluídos no Integration Services funcionam somente com tipos específicos de gerenciadores de conexões internos. Portanto, esses exemplos não podem ser testados com as tarefas e componentes internos.

Configurando o gerenciador de conexões

Definindo a propriedade ConnectionString

A propriedade ConnectionString é uma propriedade importante e a única propriedade exclusiva para um gerenciador de conexões personalizado. O gerenciador de conexões usa o valor dessa propriedade para se conectar à fonte de dados externa. Se você estiver combinando várias outras propriedades, como nome de servidor e nome de banco de dados, para criar a cadeia de conexão você pode usar uma função auxiliar para montar a cadeia, substituindo alguns valores de um modelo de cadeia de conexão pelo novo valor fornecido pelo usuário. O exemplo de código seguinte mostra uma implementação da propriedade ConnectionString que confia em uma função auxiliar para montar a cadeia.

  ' Default values.
  Private _serverName As String = "(local)"
  Private _databaseName As String = "AdventureWorks"
  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 = "AdventureWorks";
    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;

    }

Validando o gerenciador de conexões

Você anula o método Validate para ter certeza de que o gerenciador de conexões foi configurado corretamente. No mínimo, você deve validar o formato da cadeia de conexão e se certificar de que foram fornecidos valores para todos os argumentos. A execução não pode continuar até que o gerenciador de conexões retorne Success do método Validate.

O exemplo de código seguinte mostra uma implementação de Validate que assegura que o usuário especificou um nome de servidor para a conexão.

  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;
      }

    }

Persistindo o gerenciador de conexões

Normalmente, você não tem que implementar a persistência personalizada em um gerenciador de conexões. A persistência personalizada é necessária somente quando as propriedades de um objeto usam tipos de dados complexos. Para obter mais informações, consulte Desenvolvendo objetos personalizados para o Integration Services.

Trabalhando com a fonte de dados externa

Os métodos que suportam a conexão a uma fonte de dados externa são os métodos mais importantes de um gerenciador de conexões personalizado. Os métodos AcquireConnection e ReleaseConnection são chamados em vários momentos durante o tempo de design e o tempo de execução.

Adquirindo a conexão

Você precisa decidir que tipo de objeto é apropriado para o método AcquireConnection para voltar de seu gerenciador de conexões personalizado. Por exemplo, um gerenciador de conexões de Arquivo retorna somente uma cadeia que contém um caminho e um nome de arquivo, enquanto o gerenciador de conexões ADO.NET retorna um objeto de conexão gerenciado que já está aberto. Um gerenciador de conexões OLE DB retorna um objeto de conexão do OLE DB nativo que não pode ser usado a partir do código gerenciado. O gerenciador de conexões SQL Server personalizado, do qual são tirados os trechos de códigos deste tópico, retorna um objeto SqlConnection aberto.

Os usuários do seu gerenciador de conexões precisam saber antecipadamente que tipo de objeto devem esperar, assim podem converter o objeto retornado para o tipo apropriado e acessar seus métodos e propriedades.

  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;

    }

Liberando a conexão

A ação adotada no método ReleaseConnection depende do tipo de objeto que você retornou do método AcquireConnection. Se houver um objeto de conexão aberto, você deve fechá-lo e liberar qualquer recurso que esteja usando. Se AcquireConnection retornou só um valor da cadeia de caracteres, nenhuma ação precisa ser tomada.

  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();
    }
Ícone do Integration Services (pequeno) Fique atualizado com o Integration Services

Para obter os mais recentes downloads, artigos, exemplos e vídeos da Microsoft, bem como soluções selecionadas da comunidade, visite a página do Integration Services no MSDN ou TechNet:

Para receber uma notificação automática sobre estas atualizações, assine os RSS feeds disponíveis na página.

Histórico de alterações

Conteúdo atualizado

  • Uma observação que explica por que os exemplos personalizados não podem ser testados com tarefas e componentes internos no Integration Services foi adicionada.