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.

HinweisHinweis

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 MicrosoftVisual 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 SkriptMicrosoftVisual Basic 2008 oder MicrosoftVisual 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.

  1. Überschreiben Sie die AcquireConnections-Methode, um eine Verbindung mit der externen Datenquelle herzustellen. Extrahieren Sie das Verbindungsobjekt bzw. die erforderlichen Verbindungsinformationen vom Verbindungs-Manager.

  2. Ü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.

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

  4. Ü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.

HinweisHinweis

In diesen Beispielen werden die erste und vierte Spalte der Tabelle Person.Address in der Beispieldatenbank AdventureWorks, die Spalten intAddressID 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:

  1. Erstellen Sie einen ADO.NET-Verbindungs-Manager, der mithilfe des SqlClient-Anbieters eine Verbindung mit der AdventureWorks-Datenbank herstellt.

  2. Erstellen Sie eine Zieltabelle, indem Sie den folgenden Transact-SQL-Befehl in der AdventureWorks-Datenbank ausführen:

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    )
    
  3. Fügen Sie der Oberfläche des Datenfluss-Designers eine neue Skriptkomponente hinzu, und konfigurieren Sie sie als Ziel.

  4. 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 Tabelle Person.Address der Beispieldatenbank AdventureWorks, die mindestens die Spalten AddressID und City enthält, bereitstellen.

  5. Öffnen Sie den Transformations-Editor für Skripterstellung. Wählen Sie auf der Seite Eingabespalten die Eingabespalten AddressID und City aus.

  6. Geben Sie der Eingabe auf der Seite Eingaben und Ausgaben einen aussagekräftigeren Namen, z. B. MeineAdresseingabe.

  7. Erstellen oder fügen Sie auf der Seite Verbindungs-Manager den ADO.NET-Verbindungs-Manager mit einem Namen wie MeinADONETVerbindungsManager hinzu.

  8. Klicken Sie auf der Seite Skript auf Skript bearbeiten, und geben Sie das folgende Skript ein. Schließen Sie dann die Skriptentwicklungsumgebung.

  9. 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:

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

  2. Fügen Sie zur Datenfluss-Designeroberfläche eine neue Skriptkomponente hinzu, und konfigurieren Sie sie als Ziel.

  3. 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 Tabelle Person.Address der Beispieldatenbank AdventureWorks bereitstellen, und mindestens die Spalten AddressID und City enthalten.

  4. Öffnen Sie den Transformations-Editor für Skripterstellung. Wählen Sie auf der Seite Eingabespalten die Spalten AddressID und City aus.

  5. Geben Sie auf der Seite Eingaben und Ausgaben der Eingabe einen aussagekräftigeren Namen ein, z. B. MeineAdresseingabe.

  6. Erstellen oder fügen Sie auf der Seite Verbindungs-Manager den Verbindungs-Manager für Flatfiles mit einem aussagekräftigen Namen wie MeinFlatdateiZielVerbindungsManager hinzu.

  7. Klicken Sie auf der Seite Skript auf Skript bearbeiten, und geben Sie das folgende Skript ein. Schließen Sie dann die Skriptentwicklungsumgebung.

  8. 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();

    }

}
Integration Services (kleines Symbol) Bleiben Sie mit Integration Services auf dem neuesten Stand

Die neuesten Downloads, Artikel, Beispiele und Videos von Microsoft sowie ausgewählte Lösungen aus der Community finden Sie auf der Integration Services-Seite von MSDN oder TechNet:

Abonnieren Sie die auf der Seite verfügbaren RSS-Newsfeeds, um automatische Benachrichtigungen zu diesen Aktualisierungen zu erhalten.