Поделиться через


Написание кода пользовательского диспетчера соединений

Область применения: среда выполнения интеграции SSIS SQL Server в Фабрика данных Azure

После создания класса, наследующего от базового класса ConnectionManagerBase, и применения к нему атрибута DtsConnectionAttribute, необходимо переопределить реализацию свойств и методов базового класса, чтобы обеспечить пользовательские функциональные возможности.

Примеры пользовательских диспетчеров соединений см. в разделе Разработка пользовательского интерфейса для пользовательского диспетчера соединений. Примеры кода, приведенные в этом разделе, взяты из образца пользовательского диспетчера соединений SQL Server.

Примечание.

Большинство задач, источников и назначений, встроенных в службы Integration Services, работают только с определенными типами встроенных диспетчеров соединений. Поэтому данные образцы нельзя протестировать с помощью встроенных задач и компонентов.

Настройка диспетчера соединений

Задание свойства ConnectionString

Свойство ConnectionString – важное свойство, которое является единственным уникальным свойством для пользовательского диспетчера соединений. Диспетчер соединений использует значение этого свойства для соединения с внешним источником данных. Если необходимо скомбинировать несколько других свойств, например, имя сервера и имя базы данных, чтобы создать строку соединения, можно использовать вспомогательную функцию для сборки строки путем замены определенных значений в шаблоне строки соединения новыми значениями, предоставленными пользователем. В следующем примере кода демонстрируется реализация свойства ConnectionString, которое использует вспомогательную функцию для сборки строки.

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

Работа с внешним источником данных

Методы, поддерживающие соединение с внешним источником данных, являются наиболее важными методами для пользовательского диспетчера соединений. Методы AcquireConnection и ReleaseConnection вызываются в различные моменты, как во время разработки, так и во время выполнения.

Получение соединения

Необходимо решить, какого типа объект должен возвращаться методом 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();  
}  

См. также

Создание пользовательского диспетчера соединений
Разработка пользовательского интерфейса для пользовательского диспетчера соединений