编写自定义连接管理器代码

创建继承自 ConnectionManagerBase 基类的类并将 DtsConnectionAttribute 属性应用于该类后,必须重写基类的属性和方法的实现以提供自定义功能。

有关自定义连接管理器的工作示例,请参阅 Codeplex 上的 Integration Services 示例。本主题中演示的代码示例来自 SQL Server 自定义连接管理器示例。

注意注意

内置于 Integration Services 的大多数任务、源和目标都只能与特定类型的内置连接管理器一起工作。因此,不能使用内置任务和组件测试这些示例。

配置连接管理器

设置 ConnectionString 属性

ConnectionString 属性是一个重要的属性,并且是自定义连接管理器独有且唯一的属性。连接管理器使用此属性的值连接到外部数据源。如果组合多个其他属性(如服务器名称和数据库名称)来创建连接字符串,则可以使用 Helper 函数来组合字符串,方法是使用用户提供的新值来替换连接字符串模板中的某些值。下面的代码示例演示了 ConnectionString 属性的实现,该属性依赖 Helper 函数来组合字符串。

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

    }

验证连接管理器

重写 Validate 方法以确保连接管理器已正确配置。您至少应验证连接字符串的格式并确保已为所有参数提供值。在连接管理器从 Validate 方法返回 Success 之前,执行不能继续。

下面的代码示例演示用于确保用户已为连接指定服务器名称的 Validate 的实现。

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

    }

使连接管理器持久化

通常不需要对连接管理器实现自定义持久性。自定义持久性仅在对象的属性使用复杂数据类型时才需要。有关详细信息,请参阅开发 Integration Services 的自定义对象

使用外部数据源

用于支持与外部数据源连接的方法是自定义连接管理器的最重要方法。会在设计时和运行时期间的不同时间调用 AcquireConnectionReleaseConnection 方法。

获取连接

您需要决定哪种类型的对象适合由 AcquireConnection 方法从自定义连接管理器返回。例如,文件连接管理器只返回包含路径和文件名的字符串,而 ADO.NET 连接管理器则返回已打开的托管连接对象。OLE DB 连接管理器返回本机 OLE DB 连接对象,这些对象不能从托管代码使用。自定义 SQL Server 连接管理器(从中获取本主题中的代码段)返回打开的 SqlConnection 对象。

连接管理器用户需要事先了解所需的对象类型,以便可以将返回的对象转换为合适的类型并访问其方法和属性。

  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;

    }

释放连接

ReleaseConnection 方法中执行的操作取决于从 AcquireConnection 方法返回的对象类型。如果存在已打开的连接对象,则应将其关闭,并释放该对象所使用的所有资源。如果 AcquireConnection 只返回了一个字符串值,则无需执行任何操作。

  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();
    }
Integration Services 图标(小) 使 Integration Services 保持最新

若要从 Microsoft 获得最新的下载内容、文章、示例和视频,以及从社区获得所选解决方案,请访问 MSDN 或 TechNet 上的 Integration Services 页:

若要获得有关这些更新的自动通知,请订阅该页上提供的 RSS 源。

更改历史记录

更新的内容

  • 添加了一条说明,指出为什么不能使用 Integration Services 中的内置任务和组件测试这些自定义示例。