Erstellen einer Quelle mit der Skriptkomponente

Quellkomponenten dienen im Datenfluss eines Integration Services-Pakets dazu, Daten aus einer Datenquelle zu laden, um sie an Downstreamtransformationen und -ziele zu übergeben. Gewöhnlich stellen Sie über einen vorhandenen Verbindungs-Manager eine Verbindung mit der Datenquelle her.

Eine Übersicht über die Skriptkomponente bietet 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, die bei der Entwicklung einer benutzerdefinierten Datenflusskomponente durchlaufen werden, vertraut zu machen. Informationen dazu finden Sie unter Entwickeln einer benutzerdefinierten Datenflusskomponente, insbesondere im Thema Entwickeln einer benutzerdefinierten Quellkomponente.

Erste Schritte mit einer Quellkomponente

Wenn Sie im Bereich Datenfluss des SSIS-Designers eine Skriptkomponente hinzufügen, wird das Dialogfeld Skriptkomponententyp auswählen geöffnet, und Sie werden zur Auswahl eines Quell-, Ziel- oder Transformationsskripts aufgefordert. Wählen Sie im Dialogfeld die Option Quelle.

Konfigurieren einer Quellkomponente im Metadatenentwurfsmodus

Nachdem Sie die Erstellung einer Quellkomponente 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.

Eine Datenflussquellkomponente verfügt über keine Eingaben und unterstützt eine oder mehrere Ausgaben. Die Konfiguration der Ausgaben für die Komponente ist einer der Schritte, den Sie mithilfe des Transformations-Editors für Skripterstellung im Metadatenentwurfsmodus abschließen müssen, bevor Sie das benutzerdefinierte Skript schreiben.

Sie können zudem die Skriptsprache über die ScriptLanguage-Eigenschaft auf der Seite Skript des Transformations-Editors für Skripterstellung festlegen.

HinweisHinweis

Um die Standardskriptsprache für Skriptkomponenten und Skripttasks festzulegen, verwenden Sie im Dialogfeld Optionen auf der Seite Allgemein die Option Skriptsprache. Weitere Informationen finden Sie unter Seite Allgemein.

Hinzufügen von Verbindungs-Managern

Eine Quellkomponente verwendet normalerweise einen vorhandenen Verbindungs-Manager zum Herstellen einer Verbindung mit der Datenquelle, aus der Daten in den Datenfluss geladen werden. 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 Daten kapselt und speichert, die sie benötigt, um eine Verbindung mit einer bestimmten Art von Datenquelle herzustellen. Sie müssen, um Daten zu laden und zu speichern sowie möglicherweise auch um eine Verbindung mit der Datenquelle herzustellen und diese zu beenden, 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 über die Seite Verbindungs-Manager des Transformations-Editors für Skripterstellung finden Sie unter Transformations-Editor für Skripterstellung (Seite Verbindungs-Manager).

Konfigurieren von Ausgaben und Ausgabespalten

Eine Quellkomponente verfügt über keine Eingaben und unterstützt eine oder mehrere Ausgaben. Auf der Seite Eingaben und Ausgaben im Transformations-Editor für Skripterstellung ist standardmäßig eine Ausgabe eingerichtet. Ausgabespalten sind hingegen nicht vorhanden. Auf dieser Seite des Editors haben Sie die Möglichkeit, die folgenden Elemente zu konfigurieren.

  • Sie müssen Ausgabespalten für jede Ausgabe manuell hinzufügen und konfigurieren. Wählen Sie den Ausgabespaltenordner für die jeweilige Ausgabe, und verwalten Sie anschließend die Ausgabespalten für alle Ausgaben der Quellkomponente mithilfe der Schaltflächen Spalte hinzufügen und Spalte entfernen. Die Namen, die Sie den Ausgabespalten hier zuweisen, verwenden Sie später mithilfe der typisierten Accessoreigenschaften, die im automatisch generierten Code erstellt wurden, für Verweise im Skript.

  • Sie haben die Möglichkeit, eine oder mehrere zusätzliche Ausgaben zu erstellen, beispielsweise eine simulierte Fehlerausgabe für Zeilen, die unerwartete Werte aufweisen. Verwenden Sie die Schaltflächen Ausgabe hinzufügen und Ausgabe entfernen, um die Ausgaben der Quellkomponente zu verwalten. Alle Eingabezeilen werden an alle verfügbaren Ausgaben weitergeleitet, außer Sie legen einen identischen Wert ungleich Null für die ExclusionGroup-Eigenschaft der Ausgaben fest, bei denen Sie jede Zeile nur an eine der Ausgaben weiterleiten möchten, die denselben ExclusionGroup-Wert aufweisen. Der spezifische ganzzahlige Wert, den Sie auswählen, um die ExclusionGroup zu kennzeichnen, ist nicht von Bedeutung.

    HinweisHinweis

    Sie können auch einen Wert ungleich Null für die ExclusionGroup-Eigenschaft für eine einzelne Ausgabe verwenden, wenn Sie nicht alle Zeilen ausgeben möchten. In diesem Fall müssen Sie jedoch für alle Zeilen, die an die Ausgabe gesendet werden sollen, explizit die DirectRowTo<outputbuffer>-Methode aufrufen.

  • Sie können allen Ausgaben einen Anzeigenamen zuweisen. Sie verwenden die Namen der Ausgaben in Ihrem Skript später für Verweise mithilfe der typisierten Accessoreigenschaften, die im automatisch generierten Code erstellt wurden.

  • Gewöhnlich haben mehrere Ausgaben in der gleichen ExclusionGroup die gleichen Ausgabespalten. Falls Sie eine simulierte Fehlerausgabe erstellen, sollten Sie jedoch mehrere Spalten hinzufügen, um Fehlerinformationen zu speichern. Informationen dazu, wie das Datenflussmodul Fehlerzeilen verarbeitet, finden Sie unter Verwenden von Fehlerausgaben in einer Datenflusskomponente. In der Skriptkomponente müssen Sie hingegen eigenen Code schreiben, um geeignete Fehlerinformationen für die zusätzlichen Spalten zu erhalten. Weitere Informationen finden Sie unter Simulieren einer Fehlerausgabe für die Skriptkomponente.

Weitere Informationen zur 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 Werte vorhandener Variablen in Ihrem Skript verwenden möchten, können Sie diese in den Eigenschaftenfeldern für ReadOnlyVariables und ReadWriteVariables auf der Seite Skript des Transformations-Editors für Skripterstellung hinzufügen.

Wenn Sie mehrere Variablen in die Eigenschaftenfelder eingeben, trennen Sie die Variablennamen durch Kommas. Sie können auch mehrere Variablen eingeben, indem Sie auf die Schaltfläche mit den drei Punkten () neben den Eigenschaftenfeldern für ReadOnlyVariables und ReadWriteVariables klicken und 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 zur Seite Skript des Transformations-Editors für Skripterstellung finden Sie unter Transformations-Editor für Skripterstellung (Seite Skript).

Schreiben einer Quellkomponente im Codeentwurfsmodus

Nachdem Sie die Metadaten für die Komponente konfiguriert haben, öffnen Sie die MicrosoftVisual Studio Tools for Applications (VSTA) IDE, um das benutzerdefinierte Skript zu codieren. Klicken Sie dazu im Transformations-Editor für Skripterstellung auf der Seite Skript auf Skript bearbeiten. Abhängig von der Skriptsprache, die Sie für die ScriptLanguage-Eigenschaft gewählt haben, können Sie das Skript entweder in MicrosoftVisual Basic 2008 oder in MicrosoftVisual C# 2008 schreiben.

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 Quellkomponente die VSTA IDE öffnen, wird die bearbeitbare ScriptMain-Klasse im Code-Editor angezeigt. Sie schreiben den benutzerdefinierten Code in der ScriptMain-Klasse.

Die ScriptMain-Klasse schließt einen Stub für die CreateNewOutputRows-Methode ein. CreateNewOutputRows ist die wichtigste Methode in einer Quellkomponente.

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 PrimeOutput-Methode in der UserComponent-Klasse auf, die die PrimeOutput-Methode der übergeordneten ScriptComponent-Klasse überschreibt. Die PrimeOutput-Methode ruft anschließend die folgenden Methoden auf:

  1. Die CreateNewOutputRows-Methode, die Sie in ScriptMain überschreiben können, um den Ausgabepuffern, die zunächst leer sind, Zeilen der Datenquelle hinzuzufügen.

  2. Die FinishOutputs-Methode, die standardmäßig leer ist. Setzen Sie diese Methode in ScriptMain außer Kraft, um Verarbeitungsschritte auszuführen, die zum Abschluss der Ausgabe erforderlich sind.

  3. Die private MarkOutputsAsFinished-Methode, welche die SetEndOfRowset-Methode der übergeordneten ScriptBuffer-Klasse aufruft, um das Datenflussmodul über die Fertigstellung der Ausgabe in Kenntnis zu setzen. Sie müssen SetEndOfRowset nicht explizit in Ihrem eigenen Code aufrufen.

Schreiben von benutzerdefiniertem Code

Um die Erstellung einer benutzerdefinierten Quellkomponente abzuschließen, können Sie Skripts in den folgenden Methoden schreiben, die in der ScriptMain-Klasse zur Verfügung stehen.

  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 die PreExecute-Methode, um Daten zu laden, falls Sie alle Quelldaten gleichzeitig laden können. Sie können beispielsweise einen SqlCommand an einer ADO.NET-Verbindung mit einer SQL Server-Datenbank ausführen und alle Quelldaten gleichzeitig in einen SqlDataReader laden. Falls Sie die Quelldaten zeilenweise laden müssen (z. B. beim Lesen einer Textdatei), können Sie die Daten beim Durchlaufen der Zeilen in CreateNewOutputRows laden.

  3. Mithilfe der überschriebenen CreateNewOutputRows-Methode können Sie leere Ausgabepuffer um neue Zeilen ergänzen und die Werte der einzelnen Spalten den neuen Ausgabezeilen hinzufügen. Verwenden Sie die AddRow-Methode der einzelnen Ausgabepuffer, um leere neue Zeilen hinzuzufügen, und legen Sie anschließend die Werte der einzelnen Spalten fest. Üblicherweise kopieren Sie die Werte aus den Spalten, die aus der externen Quelle geladen werden.

  4. Überschreiben Sie die PostExecute-Methode, um die Verarbeitung der Daten abzuschließen. Sie können beispielsweise den SqlDataReader schließen, mit dem Sie die Daten geladen haben.

  5. Überschreiben Sie ggf. die ReleaseConnections-Methode, um die Verbindung mit der externen Datenquelle zu trennen.

Beispiele

In den folgenden Beispielen wird der benutzerdefinierte Code veranschaulicht, der in der ScriptMain-Klasse zur Erstellung einer Quellkomponente 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.

ADO.NET-Quellenbeispiel

Diese Beispiel zeigt eine Quellkomponente, die einen vorhandenen ADO.NET-Verbindungs-Manager zum Laden von Daten aus einer SQL Server-Tabelle in den Datenfluss einsetzt.

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. Fügen Sie der Datenfluss-Designeroberfläche eine neue Skriptkomponente hinzu, und konfigurieren Sie sie als Quelle.

  3. Öffnen Sie den Transformations-Editor für Skripterstellung. Geben Sie der standardmäßigen Ausgabe auf der Seite Eingaben und Ausgaben einen aussagekräftigeren Namen, z. B. MeineAdressausgabe. Fügen Sie die beiden Ausgabespalten AddressID und City hinzu, und konfigurieren Sie diese.

  4. Fügen Sie auf der Seite Verbindungs-Manager den ADO.NET-Verbindungs-Manager hinzu, oder erstellen Sie diesen, und geben Sie ihm einen Namen wie MeineADONETVerbindung.

  5. Klicken Sie auf der Seite Skript auf Skript bearbeiten, und geben Sie das folgende Skript ein. Schließen Sie anschließend die Skriptentwicklungsumgebung und den Transformations-Editor für Skripterstellung.

  6. Erstellen und konfigurieren Sie eine Zielkomponente, die die Spalten AddressID und City erwartet, z. B. ein SQL Server-Ziel oder die Beispielzielkomponente, die unter Erstellen eines Ziels mit der Skriptkomponente veranschaulicht wird. Stellen Sie anschließend eine Verbindung der Quellkomponente mit dem Ziel her. (Sie können eine Quelle ohne Transformationen direkt mit einem Ziel verbinden.) Sie können eine Zieltabelle erstellen, 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
    )
    
  7. Führen Sie das Beispiel aus.

    Imports System.Data.SqlClient
    ...
    Public Class ScriptMain
        Inherits UserComponent
    
        Dim connMgr As IDTSConnectionManager100
        Dim sqlConn As SqlConnection
        Dim sqlReader As SqlDataReader
    
        Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
    
            connMgr = Me.Connections.MyADONETConnection
            sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)
    
        End Sub
    
        Public Overrides Sub PreExecute()
    
            Dim cmd As New SqlCommand("SELECT AddressID, City, StateProvinceID FROM Person.Address", sqlConn)
            sqlReader = cmd.ExecuteReader
    
        End Sub
    
        Public Overrides Sub CreateNewOutputRows()
    
            Do While sqlReader.Read
                With MyAddressOutputBuffer
                    .AddRow()
                    .AddressID = sqlReader.GetInt32(0)
                    .City = sqlReader.GetString(1)
                End With
            Loop
    
        End Sub
    
        Public Overrides Sub PostExecute()
    
            sqlReader.Close()
    
        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;
        SqlDataReader sqlReader;
    
        public override void AcquireConnections(object Transaction)
        {
            connMgr = this.Connections.MyADONETConnectionManager;
            sqlConn = (SqlConnection)connMgr.AcquireConnection(null);
    
        }
    
        public override void PreExecute()
        {
    
            SqlCommand cmd = new SqlCommand("SELECT AddressID, City, StateProvinceID FROM Person.Address", sqlConn);
            sqlReader = cmd.ExecuteReader();
    
        }
    
        public override void CreateNewOutputRows()
        {
    
            while (sqlReader.Read())
            {
                {
                    MyAddressOutputBuffer.AddRow();
                    MyAddressOutputBuffer.AddressID = sqlReader.GetInt32(0);
                    MyAddressOutputBuffer.City = sqlReader.GetString(1);
                }
            }
    
        }
    
        public override void PostExecute()
        {
    
            sqlReader.Close();
    
        }
    
        public override void ReleaseConnections()
        {
    
            connMgr.ReleaseConnection(sqlConn);
    
        }
    
    }
    

Flatfilequellenbeispiel

Diese Beispiel zeigt eine Quellkomponente, die einen vorhandenen Verbindungs-Manager für Flatfiles zum Laden von Daten aus einer Flatfile in den Datenfluss einsetzt. Die Flatfilequelldaten werden durch einen Export aus SQL Server erstellt.

Wenn Sie den Beispielcode ausführen möchten, müssen Sie das Paket und die Komponente folgendermaßen konfigurieren:

  1. Exportieren Sie mithilfe des SQL Server-Import/Export-Assistenten die Tabelle Person.Address aus der AdventureWorks-Beispieldatenbank in eine kommagetrennte Flatfile. In diesem Beispiel wird der Dateiname ExportedAddresses.txt verwendet.

  2. Erstellen Sie einen Verbindungs-Manager für Flatfiles, der eine Verbindung mit der exportierten Datendatei herstellt.

  3. Fügen Sie der Datenfluss-Designeroberfläche eine neue Skriptkomponente hinzu, und konfigurieren Sie sie als Quelle.

  4. Öffnen Sie den Transformations-Editor für Skripterstellung. Geben Sie auf der Seite Eingaben und Ausgaben der standardmäßigen Ausgabe einen aussagekräftigeren Namen, z. B. MyAddressOutput. Fügen Sie die beiden Ausgabespalten AddressID und City hinzu, und konfigurieren Sie diese.

  5. Fügen Sie auf der Seite Verbindungs-Manager den Verbindungs-Manager für Flatfiles hinzu, oder erstellen Sie diesen, und geben Sie ihm einen aussagekräftigen Namen, z. B. MeinFlatdateiQuellVerbindungsManager.

  6. Klicken Sie auf der Seite Skript auf Skript bearbeiten, und geben Sie das folgende Skript ein. Schließen Sie anschließend die Skriptentwicklungsumgebung und den Transformations-Editor für Skripterstellung.

  7. Erstellen und konfigurieren Sie eine Zielkomponente, z. B. ein SQL Server-Ziel oder die Beispielzielkomponente, die unter Erstellen eines Ziels mit der Skriptkomponente veranschaulicht wird. Stellen Sie anschließend eine Verbindung der Quellkomponente mit dem Ziel her. (Sie können eine Quelle ohne Transformationen direkt mit einem Ziel verbinden.) Sie können eine Zieltabelle erstellen, 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
    )
    
  8. Führen Sie das Beispiel aus.

    Imports System.IO
    ...
    Public Class ScriptMain
        Inherits UserComponent
    
        Private textReader As StreamReader
        Private exportedAddressFile As String
    
        Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
    
            Dim connMgr As IDTSConnectionManager100 = _
                Me.Connections.MyFlatFileSrcConnectionManager
            exportedAddressFile = _
                CType(connMgr.AcquireConnection(Nothing), String)
    
        End Sub
    
        Public Overrides Sub PreExecute()
            MyBase.PreExecute()
            textReader = New StreamReader(exportedAddressFile)
        End Sub
    
        Public Overrides Sub CreateNewOutputRows()
    
            Dim nextLine As String
            Dim columns As String()
    
            Dim delimiters As Char()
            delimiters = ",".ToCharArray
    
            nextLine = textReader.ReadLine
            Do While nextLine IsNot Nothing
                columns = nextLine.Split(delimiters)
                With MyAddressOutputBuffer
                    .AddRow()
                    .AddressID = columns(0)
                    .City = columns(3)
                End With
                nextLine = textReader.ReadLine
            Loop
    
        End Sub
    
        Public Overrides Sub PostExecute()
            MyBase.PostExecute()
            textReader.Close()
    
        End Sub
    
    End Class
    
    using System.IO;
    public class ScriptMain:
        UserComponent
    
    {
        private StreamReader textReader;
        private string exportedAddressFile;
    
        public override void AcquireConnections(object Transaction)
        {
    
            IDTSConnectionManager100 connMgr = this.Connections.MyFlatFileSrcConnectionManager;
            exportedAddressFile = (string)connMgr.AcquireConnection(null);
    
        }
    
        public override void PreExecute()
        {
            base.PreExecute();
            textReader = new StreamReader(exportedAddressFile);
        }
    
        public override void CreateNewOutputRows()
        {
    
            string nextLine;
            string[] columns;
    
            char[] delimiters;
            delimiters = ",".ToCharArray();
    
            nextLine = textReader.ReadLine();
            while (nextLine != null)
            {
                columns = nextLine.Split(delimiters);
                {
                    MyAddressOutputBuffer.AddRow();
                    MyAddressOutputBuffer.AddressID = columns[0];
                    MyAddressOutputBuffer.City = columns[3];
                }
                nextLine = textReader.ReadLine();
            }
    
        }
    
        public override void PostExecute()
        {
    
            base.PostExecute();
            textReader.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.