Написание кода пользовательского диспетчера соединений
После создания класса, наследующего базовый класс ConnectionManagerBase, и применения к нему атрибута DtsConnectionAttribute необходимо переопределить реализацию свойств и методов базового класса, чтобы обеспечить пользовательские функциональные возможности.
Образцы пользовательских диспетчеров соединений см. в образцах служб Integration Services в разделе Codeplex. Примеры кода, приведенные в этом разделе, взяты из образца пользовательского диспетчера соединений SQL Server.
Примечание |
---|
Большая часть задач, источников и назначений в службах Integration Services работает только с определенными типами встроенных диспетчеров соединений. Поэтому данные образцы нельзя протестировать с помощью встроенных задач и компонентов. |
Настройка диспетчера соединений
Задание свойства ConnectionString
Свойство ConnectionString – важное свойство, которое является единственным уникальным свойством для пользовательского диспетчера соединений. Диспетчер соединений использует значение этого свойства для соединения с внешним источником данных. Если необходимо скомбинировать несколько других свойств, например, имя сервера и имя базы данных, чтобы создать строку соединения, можно использовать вспомогательную функцию для сборки строки путем замены определенных значений в шаблоне строки соединения новыми значениями, предоставленными пользователем. В следующем примере кода демонстрируется реализация свойства ConnectionString, которое использует вспомогательную функцию для сборки строки.
' 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;
}
Проверка диспетчера соединений
Необходимо переопределить метод 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();
}
|