Aggiunta di componenti del flusso di dati a livello di programmazione
Il primo passaggio per la generazione di un flusso di dati consiste nell'aggiunta di componenti. È quindi necessario configurarli e connetterli per stabilire il flusso di dati in fase di esecuzione. In questa sezione vengono descritti i passaggi per aggiungere un componente all'attività Flusso di dati, creare la relativa istanza della fase di progettazione e quindi configurarlo. Per informazioni su come connettere i componenti, vedere Connessione dei componenti del flusso di dati a livello di programmazione.
Aggiunta di un componente
Chiamare il metodo New della raccolta ComponentMetaDataCollection per creare un nuovo componente e aggiungerlo all'attività Flusso di dati. Questo metodo restituisce l'interfaccia IDTSComponentMetaData100 del componente. Tuttavia, a questo punto, IDTSComponentMetaData100 non contiene informazioni specifiche di un determinato componente. Impostare la proprietà ComponentClassID per identificare il tipo di componente. L'attività Flusso di dati utilizza il valore di questa proprietà per creare un'istanza del componente in fase di esecuzione.
Il valore specificato nella proprietà ComponentClassID può essere il CLSID, il PROGID o la proprietà CreationName del componente. Il CLSID viene in genere visualizzato nella finestra delle proprietà come valore della proprietà ComponentClassID del componente. Per informazioni su come ottenere questa e altre proprietà dei componenti disponibili, vedere Individuazione dei componenti del flusso di dati a livello di programmazione.
Aggiunta di un componente gestito
Non è possibile utilizzare il CLSID o il PROGID per aggiungere uno dei componenti gestiti al flusso di dati, perché questi valori puntano a un wrapper e non al componente stesso. In alternativa, è possibile utilizzare la proprietà CreationName o AssemblyQualifiedName, come illustrato nell'esempio seguente.
Se si intende utilizzare la proprietà AssemblyQualifiedName, è necessario aggiungere un riferimento nel progetto di Visual Studio all'assembly che contiene il componente gestito. Tali assembly non sono visualizzati nella scheda .NET della finestra di dialogo Aggiungi riferimento. In genere, è necessario individuare l'assembly nella cartella C:\Programmi\Microsoft SQL Server\100\DTS\PipelineComponents.
I componenti del flusso di dati gestiti predefiniti includono:
Origine ADO.NET
Origine XML
Destinazione DataReader
Destinazione SQL Server Compact
Componente script
Nell'esempio di codice seguente sono illustrate entrambe le modalità di aggiunta di componenti gestiti al flusso di dati:
using System;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Pipeline;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
namespace Microsoft.SqlServer.Dts.Samples
{
class Program
{
static void Main(string[] args)
{
Microsoft.SqlServer.Dts.Runtime.Package package = new Microsoft.SqlServer.Dts.Runtime.Package();
Executable e = package.Executables.Add("STOCK:PipelineTask");
Microsoft.SqlServer.Dts.Runtime.TaskHost thMainPipe = (Microsoft.SqlServer.Dts.Runtime.TaskHost)e;
MainPipe dataFlowTask = (MainPipe)thMainPipe.InnerObject;
// The Application object will be used to obtain the CreationName
// of a PipelineComponentInfo from its PipelineComponentInfos collection.
Application app = new Application();
// Add a first ADO NET source to the data flow.
// The CreationName property requires an Application instance.
IDTSComponentMetaData100 component1 = dataFlowTask.ComponentMetaDataCollection.New();
component1.Name = "DataReader Source";
component1.ComponentClassID = app.PipelineComponentInfos["DataReader Source"].CreationName;
// Add a second ADO NET source to the data flow.
// The AssemblyQualifiedName property requires a reference to the assembly.
IDTSComponentMetaData100 component2 = dataFlowTask.ComponentMetaDataCollection.New();
component2.Name = "DataReader Source";
component2.ComponentClassID = typeof(Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter).AssemblyQualifiedName;
}
}
}
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Module Module1
Sub Main()
Dim package As Microsoft.SqlServer.Dts.Runtime.Package = _
New Microsoft.SqlServer.Dts.Runtime.Package()
Dim e As Executable = package.Executables.Add("STOCK:PipelineTask")
Dim thMainPipe As Microsoft.SqlServer.Dts.Runtime.TaskHost = _
CType(e, Microsoft.SqlServer.Dts.Runtime.TaskHost)
Dim dataFlowTask As MainPipe = CType(thMainPipe.InnerObject, MainPipe)
' The Application object will be used to obtain the CreationName
' of a PipelineComponentInfo from its PipelineComponentInfos collection.
Dim app As New Application()
' Add a first ADO NET source to the data flow.
' The CreationName property requires an Application instance.
Dim component1 As IDTSComponentMetaData100 = _
dataFlowTask.ComponentMetaDataCollection.New()
component1.Name = "DataReader Source"
component1.ComponentClassID = app.PipelineComponentInfos("DataReader Source").CreationName
' Add a second ADO NET source to the data flow.
' The AssemblyQualifiedName property requires a reference to the assembly.
Dim component2 As IDTSComponentMetaData100 = _
dataFlowTask.ComponentMetaDataCollection.New()
component2.Name = "DataReader Source"
component2.ComponentClassID = _
GetType(Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter).AssemblyQualifiedName
End Sub
End Module
Creazione dell'istanza della fase di progettazione del componente
Chiamare il metodo Instantiate per creare l'istanza della fase di progettazione del componente identificato dalla proprietà ComponentClassID. Questo metodo restituisce l'oggetto CManagedComponentWrapper, che corrisponde al wrapper gestito per l'interfaccia IDTSDesigntimeComponent100.
Se possibile, modificare un componente utilizzando i metodi dell'istanza della fase di progettazione anziché modificando direttamente i relativi metadati. Anche se alcuni elementi dei metadati devono essere impostati direttamente, ad esempio le connessioni, in genere non è consigliabile eseguire questa operazione perché in questo modo il componente non è più in grado di monitorare e convalidare le modifiche.
Assegnazione di connessioni
Alcuni componenti, ad esempio il componente Origine OLE DB, richiedono una connessione a dati esterni e utilizzano un oggetto ConnectionManager esistente nel pacchetto a tale scopo. La proprietà Count della raccolta RuntimeConnectionCollection indica il numero di oggetti ConnectionManager di runtime richiesti dal componente. Se il conteggio è maggiore di zero, il componente richiede una connessione. Assegnare una gestione connessione dal pacchetto al componente specificando le proprietà ConnectionManager e Name della prima connessione in RuntimeConnectionCollection. Si noti che il nome della gestione connessione nella raccolta di connessioni di runtime deve corrispondere al nome della gestione connessionea cui fa riferimento il pacchetto.
Impostazione dei valori delle proprietà personalizzate
Dopo aver creato l'istanza della fase di progettazione del componente, chiamare il metodo ProvideComponentProperties. Questo metodo è simile a un costruttore, in quanto inizializza un componente appena creato definendone le proprietà personalizzate e gli oggetti di input e output. Non chiamare ProvideComponentProperties più di una volta su un componente, perché il componente potrebbe reimpostarsi e perdere le modifiche apportate in precedenza ai propri metadati.
L'oggetto CustomPropertyCollection del componente contiene una raccolta di oggetti IDTSCustomProperty100 specifici del componente. A differenza di altri modelli di programmazione, in cui le proprietà di un oggetto sono sempre visibili sullo stesso, i componenti popolano le loro raccolte di proprietà personalizzate solo quando viene chiamato il metodo ProvideComponentProperties. Dopo aver chiamato il metodo, utilizzare il metodo SetComponentProperty dell'istanza della fase di progettazione del componente per assegnare valori alle relative proprietà personalizzate. Questo metodo accetta una coppia nome/valore che identifica la proprietà personalizzata e fornisce il nuovo valore.
Inizializzazione di colonne di output
Dopo aver aggiunto un componente all'attività e dopo averlo configurato, inizializzare la raccolta di colonne in IDTSOutput100 dell'oggetto. Questo passaggio è particolarmente importante per i componenti di origine, ma è possibile che non inizializzi le colonne per i componenti di trasformazione e destinazione, in quanto in genere dipendono dalle colonne che ricevono dai componenti a monte.
Chiamare il metodo ReinitializeMetaData per inizializzare le colonne negli output di un componente di origine. Poiché i componenti non si connettono automaticamente alle origini dati esterne, chiamare il metodo AcquireConnections prima di chiamare ReinitializeMetaData per fornire al componente l'accesso all'origine dati esterna e la possibilità di popolare le proprie colonne di metadati. Infine, chiamare il metodo ReleaseConnections per rilasciare la connessione.
Passaggio successivo
Dopo l'aggiunta e la configurazione del componente, il passaggio successivo consiste nella creazione di percorsi tra componenti, come descritto nell'argomento Creazione di un percorso tra due componenti.
Esempio
Nell'esempio di codice seguente viene aggiunto il componente Origine OLE DB all'attività Flusso di dati, viene creata un'istanza della fase di progettazione del componente e vengono configurate le relative proprietà. Per questo esempio è richiesto un riferimento aggiuntivo all'assembly Microsoft.SqlServer.DTSRuntimeWrap.
using System;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using Microsoft.SqlServer.Dts.Pipeline;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
namespace Microsoft.SqlServer.Dts.Samples
{
class Program
{
static void Main(string[] args)
{
Runtime.Package package = new Runtime.Package();
Executable e = package.Executables.Add("STOCK:PipelineTask");
Runtime.TaskHost thMainPipe = e as Runtime.TaskHost;
MainPipe dataFlowTask = thMainPipe.InnerObject as MainPipe;
// Add an OLEDB connection manager to the package.
ConnectionManager cm = package.Connections.Add("OLEDB");
cm.Name = "OLEDB ConnectionManager";
cm.ConnectionString = "Data Source=(local);" +
"Initial Catalog=AdventureWorks;Provider=SQLOLEDB.1;" +
"Integrated Security=SSPI;"
// Add an OLE DB source to the data flow.
IDTSComponentMetaData100 component =
dataFlowTask.ComponentMetaDataCollection.New();
component.Name = "OLEDBSource";
component.ComponentClassID = "DTSAdapter.OleDbSource.1";
// You can also use the CLSID of the component instead of the PROGID.
//component.ComponentClassID = "{2C0A8BE5-1EDC-4353-A0EF-B778599C65A0}";
// Get the design time instance of the component.
CManagedComponentWrapper instance = component.Instantiate();
// Initialize the component
instance.ProvideComponentProperties();
// Specify the connection manager.
if (component.RuntimeConnectionCollection.Count > 0)
{
component.RuntimeConnectionCollection[0].ConnectionManager =
DtsConvert.GetExtendedInterface(package.Connections[0]);
component.RuntimeConnectionCollection[0].ConnectionManagerID =
package.Connections[0].ID;
}
// Set the custom properties.
instance.SetComponentProperty("AccessMode", 2);
instance.SetComponentProperty("SqlCommand",
"Select * from Production.Product");
// Reinitialize the metadata.
instance.AcquireConnections(null);
instance.ReinitializeMetaData();
instance.ReleaseConnections();
// Add other components to the data flow and connect them.
}
}
}
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Module Module1
Sub Main()
Dim package As Microsoft.SqlServer.Dts.Runtime.Package = _
New Microsoft.SqlServer.Dts.Runtime.Package()
Dim e As Executable = package.Executables.Add("STOCK:PipelineTask")
Dim thMainPipe As Microsoft.SqlServer.Dts.Runtime.TaskHost = _
CType(e, Microsoft.SqlServer.Dts.Runtime.TaskHost)
Dim dataFlowTask As MainPipe = CType(thMainPipe.InnerObject, MainPipe)
' Add an OLEDB connection manager to the package.
Dim cm As ConnectionManager = package.Connections.Add("OLEDB")
cm.Name = "OLEDB ConnectionManager"
cm.ConnectionString = "Data Source=(local);" & _
"Initial Catalog=AdventureWorks;Provider=SQLOLEDB.1;" & _
"Integrated Security=SSPI;"
' Add an OLE DB source to the data flow.
Dim component As IDTSComponentMetaData100 = _
dataFlowTask.ComponentMetaDataCollection.New()
component.Name = "OLEDBSource"
component.ComponentClassID = "DTSAdapter.OleDbSource.1"
' You can also use the CLSID of the component instead of the PROGID.
'component.ComponentClassID = "{2C0A8BE5-1EDC-4353-A0EF-B778599C65A0}";
' Get the design time instance of the component.
Dim instance As CManagedComponentWrapper = component.Instantiate()
' Initialize the component.
instance.ProvideComponentProperties()
' Specify the connection manager.
If component.RuntimeConnectionCollection.Count > 0 Then
component.RuntimeConnectionCollection(0).ConnectionManager = _
DtsConvert.GetExtendedInterface(package.Connections(0))
component.RuntimeConnectionCollection(0).ConnectionManagerID = _
package.Connections(0).ID
End If
' Set the custom properties.
instance.SetComponentProperty("AccessMode", 2)
instance.SetComponentProperty("SqlCommand", _
"Select * from Production.Product")
' Reinitialize the metadata.
instance.AcquireConnections(vbNull)
instance.ReinitializeMetaData()
instance.ReleaseConnections()
' Add other components to the data flow and connect them.
End Sub
End Module
|