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

适用于:SQL Server Azure 数据工厂中的 SSIS Integration Runtime

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

有关自定义连接管理器的示例,请参阅为自定义连接管理器开发用户界面。 本主题中演示的代码示例来自 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 方法以确保连接管理器已正确配置。 您至少应验证连接字符串的格式并确保已为所有参数提供值。 在连接管理器从 Success 方法返回 Validate 之前,执行不能继续。

下面的代码示例演示用于确保用户已为连接指定服务器名称的 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();  
}  

另请参阅

创建自定义连接管理器
为自定义连接管理器开发用户界面