Erstellen eines Ziels mit der Skriptkomponente
Zielkomponenten dienen im Datenfluss eines Integration Services-Pakets dazu, von Upstreamquellen empfangene Daten und Transformationen in einer Datenquelle zu speichern. Gewöhnlich stellt die Zielkomponente über einen vorhandenen Verbindungs-Manager eine Verbindung mit der Datenquelle her.
Eine Übersicht über die Skriptkomponente finden Sie unter Erweitern des Datenflusses mit der Skriptkomponente.
Die Skriptkomponente und der Infrastrukturcode, den sie generieren, erleichtern Ihnen die Entwicklung benutzerdefinierter Datenflusskomponenten deutlich. Um die Funktionsweise der Skriptkomponente zu verstehen, kann es jedoch hilfreich sein, sich mit den Schritten der Entwicklung einer benutzerdefinierten Datenflusskomponente im Entwickeln einer benutzerdefinierten Datenflusskomponente-Abschnitt vertraut zu machen, und zwar insbesondere mit Entwickeln einer benutzerdefinierten Zielkomponente.
Erste Schritte mit einer Zielkomponente
Wenn Sie zur Registerkarte Datenfluss des SSIS-Designers eine Skriptkomponente hinzufügen, wird das Dialogfeld Skriptkomponententyp auswählen geöffnet, und Sie werden zur Auswahl des Skripts Quelle, Ziel oder Transformation aufgefordert. Wählen Sie in diesem Dialogfeld Ziel aus.
Verbinden Sie anschließend die Ausgabe einer Transformation mit der Zielkomponente im SSIS-Designer. Für Tests können Sie ohne Transformationen direkt eine Quelle mit einem Ziel verbinden.
Konfigurieren einer Zielkomponente im Metadatenentwurfsmodus
Nachdem Sie die Option zur Erstellung einer Zielkomponente ausgewählt haben, konfigurieren Sie die Komponente mit dem Transformations-Editor für Skripterstellung. Weitere Informationen finden Sie unter Konfigurieren der Skriptkomponente im Skriptkomponenten-Editor.
Um die Skriptsprache auszuwählen, die das Skriptziel verwenden wird, legen Sie die ScriptLanguage-Eigenschaft auf der Seite Skript im Dialogfeld Transformations-Editor für Skripterstellung fest.
Hinweis |
---|
Um die Standardskriptsprache für die Skriptkomponente festzulegen, verwenden Sie im Dialogfeld Optionen auf der Seite Allgemein die Option Skriptsprache. Weitere Informationen finden Sie unter Seite Allgemein. |
Eine Datenflusszielkomponente verfügt über eine Eingabe und keine Ausgaben. Die Konfiguration der Eingabe für die Komponente ist einer der Schritte, den Sie mit dem Transformations-Editor für Skripterstellung im Metadatenentwurfsmodus abschließen müssen, bevor Sie das benutzerdefinierte Skript schreiben.
Hinzufügen von Verbindungs-Managern
Eine Zielkomponente verwendet normalerweise einen vorhandenen Verbindungs-Manager zum Herstellen einer Verbindung mit der Datenquelle, in der sie die Daten aus dem Datenfluss speichert. Klicken Sie im Transformations-Editor für Skripterstellung auf der Seite Verbindungs-Manager auf Hinzufügen, um den passenden Verbindungs-Manager hinzuzufügen.
Ein Verbindungs-Manager ist jedoch nur eine praktische Einheit, die die Informationen kapselt und speichert, die benötigt werden, um eine Verbindung mit einem bestimmten Datenquellentyp herzustellen. Um Daten zu laden und zu speichern und möglicherweise auch eine Verbindung mit der Datenquelle herzustellen und diese zu beenden, müssen Sie Ihren eigenen benutzerdefinierten Code schreiben.
Allgemeine Informationen über das Verwenden von Verbindungs-Managern mit der Skriptkomponente finden Sie unter Herstellen einer Verbindung zu Datenquellen in der Skriptkomponente.
Weitere Informationen zur Seite Verbindungs-Manager im Transformations-Editor für Skripterstellung finden Sie unter Transformations-Editor für Skripterstellung (Seite Verbindungs-Manager).
Konfigurieren von Eingaben und Eingabespalten
Eine Zielkomponente verfügt über eine Eingabe und keine Ausgaben.
Die Spaltenliste auf der Seite Eingabespalten im Transformations-Editor für Skripterstellung zeigt die von der Ausgabe der Upstreamkomponente im Datenfluss verfügbaren Spalten an. Wählen Sie die Spalten aus, die Sie speichern möchten.
Weitere Informationen über die Seite Eingabespalten im Transformations-Editor für Skripterstellung finden Sie unter Transformations-Editor für Skripterstellung (Seite Eingabespalten).
Auf der Seite Eingaben und Ausgaben des Transformations-Editors für Skripterstellung wird eine einzelne Eingabe angezeigt, die Sie umbenennen können. Verwenden Sie die im automatisch generierten Code erstellte Accessoreigenschaft, um mit dem Namen in Ihrem Skript auf die Eingabe zu verweisen.
Weitere Informationen über die Seite Eingaben und Ausgaben im Transformations-Editor für Skripterstellung finden Sie unter Transformations-Editor für Skripterstellung (Seiten Eingaben und Ausgaben).
Hinzufügen von Variablen
Wenn Sie die vorhandenen Variablen in Ihrem Skript verwenden möchten, können Sie diese in den Eigenschaftsfeldern für ReadOnlyVariables und ReadWriteVariables auf der Seite Skript im Transformations-Editor für Skripterstellung hinzufügen.
Wenn Sie mehrere Variablen in die Eigenschaftsfelder hinzufügen, trennen Sie die Variablennamen durch Kommas. Sie können auch mehrere Variablen auswählen, indem Sie auf die Schaltfläche mit den Auslassungszeichen (…) neben den Eigenschaftsfeldern für ReadOnlyVariables und ReadWriteVariables klicken und dann die Variablen im Dialogfeld Variablen auswählen festlegen.
Allgemeine Informationen über das Verwenden von Variablen mit der Skriptkomponente finden Sie unter Verwenden von Variablen in der Skriptkomponente.
Weitere Informationen über die Seite Skript im Transformations-Editor für Skripterstellung finden Sie unter Transformations-Editor für Skripterstellung (Seite Skript).
Schreiben einer Zielkomponente im Codeentwurfsmodus
Nachdem Sie die Metadaten für Ihre Komponente konfiguriert haben, können Sie das benutzerdefinierte Skript schreiben. Klicken Sie auf der Seite Skript im Transformations-Editor für Skripterstellung auf Skript bearbeiten, um die Microsoft Visual Studio Tools for Applications (VSTA)-IDE zu öffnen und Ihr benutzerdefiniertes Skript hinzuzufügen. Die von Ihnen verwendete Skriptsprache hängt davon ab, ob Sie auf der Seite SkriptMicrosoft Visual Basic 2008 oder Microsoft Visual C# 2008 als Skriptsprache für die ScriptLanguage-Eigenschaft festgelegt haben.
Wichtige Informationen, die alle Arten von Komponenten betreffen, die mithilfe der Skriptkomponente erstellt wurden, finden Sie unter Codieren und Debuggen der Skriptkomponente.
Grundlegendes zum automatisch generierten Code
Wenn Sie nach der Erstellung und Konfiguration einer Zielkomponente die VSTA IDE öffnen, wird die bearbeitbare ScriptMain-Klasse im Code-Editor mit einem Stub für die ProcessInputRow-Methode angezeigt. In der ScriptMain-Klasse schreiben Sie Ihren benutzerdefinierten Code, und ProcessInputRow ist die wichtigste Methode in einer Zielkomponente.
Wenn Sie das Fenster Projektexplorer in VSTA öffnen, können Sie sehen, dass die Skriptkomponente auch schreibgeschützte BufferWrapper- und ComponentWrapper-Projektelemente generiert hat. Die ScriptMain-Klasse erbt von der UserComponent-Klasse im ComponentWrapper-Projektelement.
Zur Laufzeit ruft das Datenflussmodul die ProcessInput-Methode in der UserComponent-Klasse auf, die die ProcessInput-Methode der übergeordneten ScriptComponent-Klasse überschreibt. Die ProcessInput-Methode durchläuft der Reihe nach in Schleifen die Zeilen im Eingabepuffer und ruft für jede Zeile einmal die ProcessInputRow-Methode auf.
Schreiben von benutzerdefiniertem Code
Um die Erstellung einer benutzerdefinierten Zielkomponente zu beenden, empfiehlt sich ggf. das Schreiben von Skript in den folgenden Methoden, die in der ScriptMain-Klasse verfügbar sind.
Überschreiben Sie die AcquireConnections-Methode, um eine Verbindung mit der externen Datenquelle herzustellen. Extrahieren Sie das Verbindungsobjekt bzw. die erforderlichen Verbindungsinformationen vom Verbindungs-Manager.
Überschreiben Sie als Vorbereitung zur Speicherung der Daten die PreExecute-Methode. Zum Beispiel könnte es sein, dass Sie SqlCommand und die entsprechenden Parameter in dieser Methode erstellen und konfigurieren möchten.
Verwenden Sie die überschriebene ProcessInputRow-Methode, um jede Eingabezeile in die externe Datenquelle zu kopieren. Zum Beispiel können Sie für ein SQL Server-Ziel die Spaltenwerte in die Parameter eines SqlCommand kopieren und den Befehl jeweils einmal pro Zeile ausführen. Für ein Flatfileziel können Sie die Werte für jede Spalte in einen StreamWriter schreiben, wobei die Werte durch Spaltentrennzeichen voneinander getrennt werden.
Überschreiben Sie bei Bedarf zur Trennung von der externen Datenbank und um alle weiteren erforderlichen Cleanups durchzuführen die PostExecute-Methode.
Beispiele
In den folgenden Beispielen wird der Code veranschaulicht, der in der ScriptMain-Klasse zur Erstellung einer Zielkomponente erforderlich ist.
Hinweis |
---|
In diesen Beispielen werden die erste und vierte Spalte der Person.Address-Tabelle in der AdventureWorks2008R2-Datenbank, nämlich die Spalten int AddressID und nvarchar(30) City, durch den Datenfluss weitergeleitet. Die gleichen Daten werden in den Quellen-, Transformations- und Zielbeispielen in diesem Abschnitt verwendet. Zusätzliche Voraussetzungen und Annahmen werden für jedes Beispiel dokumentiert. |
Beispiel ADO.NET-Ziel
Dieses Beispiel zeigt eine Zielkomponente, die einen vorhandenen ADO.NET-Verbindungs-Manager zum Speichern von Daten aus dem Datenfluss in eine SQL Server-Tabelle verwendet.
Wenn Sie diesen Beispielcode ausführen möchten, müssen Sie das Paket und die Komponente folgendermaßen konfigurieren:
Erstellen Sie einen ADO.NET-Verbindungs-Manager, der mithilfe des SqlClient-Anbieters eine Verbindung mit der AdventureWorks2008R2-Datenbank herstellt.
Erstellen Sie eine Zieltabelle, indem Sie den folgenden Transact-SQL-Befehl in der AdventureWorks2008R2-Datenbank ausführen:
CREATE TABLE [Person].[Address2]( [AddressID] [int] NOT NULL, [City] [nvarchar](30) NOT NULL )
Fügen Sie der Oberfläche des Datenfluss-Designers eine neue Skriptkomponente hinzu, und konfigurieren Sie sie als Ziel.
Verbinden Sie die Ausgabe einer Upstreamquelle oder Transformation mit der Zielkomponente im SSIS-Designer. (Sie können eine Quelle ohne Transformationen direkt mit einem Ziel verbinden.) Diese Ausgabe sollte Daten aus der Person.Address-Tabelle der AdventureWorks2008R2-Beispieldatenbank bereitstellen, die mindestens die Spalten AddressID und City enthält.
Öffnen Sie den Transformations-Editor für Skripterstellung. Wählen Sie auf der Seite Eingabespalten die Eingabespalten AddressID und City aus.
Geben Sie der Eingabe auf der Seite Eingaben und Ausgaben einen aussagekräftigeren Namen, z. B. MeineAdresseingabe.
Erstellen oder fügen Sie auf der Seite Verbindungs-Manager den ADO.NET-Verbindungs-Manager mit einem Namen wie MeinADONETVerbindungsManager hinzu.
Klicken Sie auf der Seite Skript auf Skript bearbeiten, und geben Sie das folgende Skript ein. Schließen Sie dann die Skriptentwicklungsumgebung.
Schließen Sie den Transformations-Editor für Skripterstellung, und führen Sie das Beispiel aus.
Imports System.Data.SqlClient
...
Public Class ScriptMain
Inherits UserComponent
Dim connMgr As IDTSConnectionManager100
Dim sqlConn As SqlConnection
Dim sqlCmd As SqlCommand
Dim sqlParam As SqlParameter
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
connMgr = Me.Connections.MyADONETConnectionManager
sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)
End Sub
Public Overrides Sub PreExecute()
sqlCmd = New SqlCommand("INSERT INTO Person.Address2(AddressID, City) " & _
"VALUES(@addressid, @city)", sqlConn)
sqlParam = New SqlParameter("@addressid", SqlDbType.Int)
sqlCmd.Parameters.Add(sqlParam)
sqlParam = New SqlParameter("@city", SqlDbType.NVarChar, 30)
sqlCmd.Parameters.Add(sqlParam)
End Sub
Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)
With sqlCmd
.Parameters("@addressid").Value = Row.AddressID
.Parameters("@city").Value = Row.City
.ExecuteNonQuery()
End With
End Sub
Public Overrides Sub ReleaseConnections()
connMgr.ReleaseConnection(sqlConn)
End Sub
End Class
using System.Data.SqlClient;
public class ScriptMain:
UserComponent
{
IDTSConnectionManager100 connMgr;
SqlConnection sqlConn;
SqlCommand sqlCmd;
SqlParameter sqlParam;
public override void AcquireConnections(object Transaction)
{
connMgr = this.Connections.MyADONETConnectionManager;
sqlConn = (SqlConnection)connMgr.AcquireConnection(null);
}
public override void PreExecute()
{
sqlCmd = new SqlCommand("INSERT INTO Person.Address2(AddressID, City) " +
"VALUES(@addressid, @city)", sqlConn);
sqlParam = new SqlParameter("@addressid", SqlDbType.Int);
sqlCmd.Parameters.Add(sqlParam);
sqlParam = new SqlParameter("@city", SqlDbType.NVarChar, 30);
sqlCmd.Parameters.Add(sqlParam);
}
public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
{
{
sqlCmd.Parameters["@addressid"].Value = Row.AddressID;
sqlCmd.Parameters["@city"].Value = Row.City;
sqlCmd.ExecuteNonQuery();
}
}
public override void ReleaseConnections()
{
connMgr.ReleaseConnection(sqlConn);
}
}
Beispiel für das Flatfileziel
Dieses Beispiel zeigt eine Zielkomponente, die einen vorhandenen Verbindungs-Manager für Flatfiles zum Speichern von Daten aus einem Datenfluss in eine Flatfile verwendet.
Wenn Sie diesen Beispielcode ausführen möchten, müssen Sie das Paket und die Komponente folgendermaßen konfigurieren:
Erstellen Sie einen Verbindungs-Manager für Flatfiles, der eine Verbindung mit einer Zieldatei herstellt. Die Datei muss nicht vorhanden sein; sie wird durch die Zielkomponente erstellt. Konfigurieren Sie die Zieldatei als durch Trennzeichen getrennte Datei, die die Spalten AddressID und City enthält.
Fügen Sie zur Datenfluss-Designeroberfläche eine neue Skriptkomponente hinzu, und konfigurieren Sie sie als Ziel.
Verbinden Sie die Ausgabe einer Upstreamquelle oder Transformation mit der Zielkomponente im SSIS-Designer. (Sie können eine Quelle ohne Transformationen direkt mit einem Ziel verbinden.) Diese Ausgabe sollte Daten aus der Person.Address-Tabelle der AdventureWorks2008R2-Beispieldatenbank bereitstellen, die mindestens die Spalten AddressID und City enthält.
Öffnen Sie den Transformations-Editor für Skripterstellung. Wählen Sie auf der Seite Eingabespalten die Spalten AddressID und City aus.
Geben Sie auf der Seite Eingaben und Ausgaben der Eingabe einen aussagekräftigeren Namen ein, z. B. MeineAdresseingabe.
Erstellen oder fügen Sie auf der Seite Verbindungs-Manager den Verbindungs-Manager für Flatfiles mit einem aussagekräftigen Namen wie MeinFlatdateiZielVerbindungsManager hinzu.
Klicken Sie auf der Seite Skript auf Skript bearbeiten, und geben Sie das folgende Skript ein. Schließen Sie dann die Skriptentwicklungsumgebung.
Schließen Sie den Transformations-Editor für Skripterstellung, und führen Sie das Beispiel aus.
Imports System.IO
...
Public Class ScriptMain
Inherits UserComponent
Dim copiedAddressFile As String
Private textWriter As StreamWriter
Private columnDelimiter As String = ","
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
Dim connMgr As IDTSConnectionManager100 = _
Me.Connections.MyFlatFileDestConnectionManager
copiedAddressFile = CType(connMgr.AcquireConnection(Nothing), String)
End Sub
Public Overrides Sub PreExecute()
textWriter = New StreamWriter(copiedAddressFile, False)
End Sub
Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)
With textWriter
If Not Row.AddressID_IsNull Then
.Write(Row.AddressID)
End If
.Write(columnDelimiter)
If Not Row.City_IsNull Then
.Write(Row.City)
End If
.WriteLine()
End With
End Sub
Public Overrides Sub PostExecute()
textWriter.Close()
End Sub
End Class
using System.IO;
public class ScriptMain:
UserComponent
{
string copiedAddressFile;
private StreamWriter textWriter;
private string columnDelimiter = ",";
public override void AcquireConnections(object Transaction)
{
IDTSConnectionManager100 connMgr = this.Connections.MyFlatFileDestConnectionManager;
copiedAddressFile = (string) connMgr.AcquireConnection(null);
}
public override void PreExecute()
{
textWriter = new StreamWriter(copiedAddressFile, false);
}
public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
{
{
if (!Row.AddressID_IsNull)
{
textWriter.Write(Row.AddressID);
}
textWriter.Write(columnDelimiter);
if (!Row.City_IsNull)
{
textWriter.Write(Row.City);
}
textWriter.WriteLine();
}
}
public override void PostExecute()
{
textWriter.Close();
}
}
|