Сохранение пользовательских объектов
Нет необходимости реализовывать нестандартную сохраняемость для создаваемых пользовательских объектов при условии, что их свойствами пользуются только простые типы данных, например integer и string. Реализация сохраняемости по умолчанию обеспечивает сохранение метаданных для пользовательского объекта, а также значений всех его свойств.
Однако, если свойствами объекта используются сложные типы данных, либо если необходимо выполнить особую обработку значений свойств во время их загрузки и сохранения, можно реализовать интерфейс IDTSComponentPersist и его методы LoadFromXML и SaveToXML. В этих методах из XML-определения пакета загружается XML-фрагмент, содержащий свойства объекта и их текущие значения, или XML-фрагмент сохраняется в XML-определении пакета. Формат этого XML-фрагмента не определен. Необходимо только, чтобы это был XML правильного формата.
Важно! |
---|
При реализации нестандартной сохраняемости необходимо обеспечить сохранение всех свойств объекта, в том числе наследуемых свойств и пользовательских свойств, добавленных разработчиком. |
Пример
Хотя для образца пользовательского диспетчера соединений SQL Server в разделе Codeplex не требуется применение пользовательской сохраняемости для трех его свойств типа string, ниже приведен образец пользовательского кода, который потребовался бы для обеспечения сохраняемости диспетчера соединений и его свойств. В классе, содержащем этот код, должен быть реализован интерфейс IDTSComponentPersist.
Private Const PERSIST_ELEMENT As String = "SqlConnectionManager"
Private Const PERSIST_SERVER As String = "Server"
Private Const PERSIST_DATABASE As String = "Database"
Private Const PERSIST_CONNECTIONSTRING As String = "ConnectionString"
Public Sub LoadFromXML(ByVal node As System.Xml.XmlElement, _
ByVal infoEvents As Microsoft.SqlServer.Dts.Runtime.IDTSInfoEvents) _
Implements Microsoft.SqlServer.Dts.Runtime.IDTSComponentPersist.LoadFromXML
Dim propertyNode As XmlNode
' Make sure that the correct node is being loaded.
If node.Name <> PERSIST_ELEMENT Then
Throw New Exception("Persisted element is not of type " & PERSIST_ELEMENT)
End If
' Load the three properties of the object from XML into variables.
For Each propertyNode In node.ChildNodes
Select Case propertyNode.Name
Case PERSIST_SERVER
_serverName = propertyNode.InnerText
Case PERSIST_DATABASE
_databaseName = propertyNode.InnerText
Case PERSIST_CONNECTIONSTRING
_connectionString = propertyNode.InnerText
End Select
Next
End Sub
Public Sub SaveToXML(ByVal doc As System.Xml.XmlDocument, _
ByVal infoEvents As Microsoft.SqlServer.Dts.Runtime.IDTSInfoEvents) _
Implements Microsoft.SqlServer.Dts.Runtime.IDTSComponentPersist.SaveToXML
Dim elementRoot As XmlElement
Dim propertyNode As XmlNode
' Create a new node to persist the object and its properties.
elementRoot = doc.CreateElement(String.Empty, PERSIST_ELEMENT, String.Empty)
' Save the three properties of the object from variables into XML.
propertyNode = doc.CreateNode(XmlNodeType.Element, PERSIST_SERVER, String.Empty)
propertyNode.InnerText = _serverName
elementRoot.AppendChild(propertyNode)
propertyNode = doc.CreateNode(XmlNodeType.Element, PERSIST_DATABASE, String.Empty)
propertyNode.InnerText = _databaseName
elementRoot.AppendChild(propertyNode)
propertyNode = doc.CreateNode(XmlNodeType.Element, PERSIST_CONNECTIONSTRING, String.Empty)
propertyNode.InnerText = _connectionString
elementRoot.AppendChild(propertyNode)
doc.AppendChild(elementRoot)
End Sub
private const string PERSIST_ELEMENT = "SqlConnectionManager";
private const string PERSIST_SERVER = "Server";
private const string PERSIST_DATABASE = "Database";
private const string PERSIST_CONNECTIONSTRING = "ConnectionString";
public void LoadFromXML(System.Xml.XmlElement node,
Microsoft.SqlServer.Dts.Runtime.IDTSInfoEvents infoEvents)
{
// Make sure that the correct node is being loaded.
if (node.Name != PERSIST_ELEMENT)
{
throw new Exception("Persisted element is not of type " + PERSIST_ELEMENT);
}
// Save the three properties of the object from variables into XML.
foreach (XmlNode propertyNode in node.ChildNodes)
{
switch (propertyNode.Name)
{
case PERSIST_SERVER:
_serverName = propertyNode.InnerText;
break;
case PERSIST_DATABASE:
_databaseName = propertyNode.InnerText;
break;
case PERSIST_CONNECTIONSTRING:
_connectionString = propertyNode.InnerText;
break;
}
}
}
public void SaveToXML(System.Xml.XmlDocument doc,
Microsoft.SqlServer.Dts.Runtime.IDTSInfoEvents infoEvents)
{
XmlElement elementRoot;
XmlNode propertyNode;
// Create a new node to persist the object and its properties.
elementRoot = doc.CreateElement(String.Empty, PERSIST_ELEMENT, String.Empty);
// Save the three properties of the object from variables into XML.
propertyNode = doc.CreateNode(XmlNodeType.Element, PERSIST_SERVER, String.Empty);
propertyNode.InnerText = _serverName;
elementRoot.AppendChild(propertyNode);
propertyNode = doc.CreateNode(XmlNodeType.Element, PERSIST_DATABASE, String.Empty);
propertyNode.InnerText = _databaseName;
elementRoot.AppendChild(propertyNode);
propertyNode = doc.CreateNode(XmlNodeType.Element, PERSIST_CONNECTIONSTRING, String.Empty);
propertyNode.InnerText = _connectionString;
elementRoot.AppendChild(propertyNode);
doc.AppendChild(elementRoot);
}
|
См. также