Skapa en källa med skriptkomponenten

gäller för:SQL Server SSIS Integration Runtime i Azure Data Factory

Du använder en källkomponent i dataflödet i ett Integration Services-paket för att läsa in data från en datakälla för vidare till underordnade omvandlingar och mål. Normalt ansluter du till datakällan via en befintlig anslutningshanterare.

En översikt över skriptkomponenten finns i Utöka dataflödet med skriptkomponenten.

Skriptkomponenten och infrastrukturkoden som genereras för dig förenklar avsevärt processen med att utveckla en anpassad dataflödeskomponent. Men för att förstå hur skriptkomponenten fungerar kan det vara bra att läsa igenom de steg som ingår i utvecklingen av en anpassad dataflödeskomponent. Se avsnittet Utveckla en komponent för anpassat dataflöde, särskilt avsnittet Utveckla en anpassad källkomponent.

Komma igång med en källkomponent

När du lägger till en skriptkomponent i fönstret Dataflöde i SSIS Designer öppnas dialogrutan Välj skriptkomponenttyp och du uppmanas att välja ett käll-, mål- eller transformeringsskript. I den här dialogrutan väljer du Källa.

Konfigurera en källkomponent i Metadata-Design läge

När du har valt att skapa en källkomponent konfigurerar du komponenten med hjälp av skripttransformeringsredigeraren. Mer information finns i Konfigurera skriptkomponenten i skriptkomponentredigeraren.

En dataflödeskälla har inga indata och stöder en eller flera utdata. Att konfigurera utdata för komponenten är ett av de steg som du måste utföra i metadatadesignläge med hjälp av skripttransformeringsredigeraren innan du skriver ditt anpassade skript.

Du kan också ange skriptspråket genom att ange egenskapen ScriptLanguagepå skriptsidan i redigeraren för skripttransformering.

Anmärkning

Om du vill ange standardskriptspråket för Skriptkomponenter och Skriptuppgifter använder du alternativet Skriptspråk på sidan Allmänt i dialogrutan Alternativ . Mer information finns på sidan Allmänt.

Lägga till anslutningshanterare

Vanligtvis använder en källkomponent en befintlig anslutningshanterare för att ansluta till datakällan som den läser in data från i dataflödet. På sidan Anslutningshanterare i skripttransformeringsredigeraren klickar du på Lägg till för att lägga till lämplig anslutningshanterare.

En anslutningshanterare är dock bara en praktisk enhet som kapslar in och lagrar den information som den måste ha för att ansluta till en datakälla av en viss typ. Du måste skriva din egen anpassade kod för att läsa in eller spara dina data och eventuellt öppna och stänga anslutningen till datakällan också.

Allmän information om hur du använder anslutningshanterare med skriptkomponenten finns i Ansluta till datakällor i skriptkomponenten.

Mer information om sidan Anslutningshanterare i redigeraren för skripttransformering finns i Redigeraren för skripttransformering (sidan Anslutningshanterare).

Konfigurera utdata och utdatakolumner

En källkomponent har inga indata och stöder en eller flera utdata. På sidan Indata och utdata i skripttransformeringsredigeraren har ett enda utdata skapats som standard, men inga utdatakolumner har skapats. På den här sidan i redigeraren kan du behöva eller vill konfigurera följande objekt.

  • Du måste lägga till och konfigurera utdatakolumner manuellt för varje utdata. Välj mappen Utdatakolumner för varje utdata och använd sedan knapparna Lägg till kolumn och Ta bort kolumn för att hantera utdatakolumnerna för varje utdata från källkomponenten. Senare refererar du till utdatakolumnerna i skriptet med de namn som du tilldelar här, med hjälp av de inskrivna egenskaper som skapats åt dig i den automatiskt genererade koden.

  • Du kanske vill skapa en eller flera ytterligare utdata, till exempel ett simulerat felutdata för rader som innehåller oväntade värden. Använd knapparna Lägg till utdata och Ta bort utdata för att hantera utdata för källkomponenten. Alla indatarader dirigeras till alla tillgängliga utdata om du inte också anger ett identiskt värde som inte är noll för egenskapen ExclusionGroup för de utdata där du tänker dirigera varje rad till endast en av de utdata som delar samma ExclusionGroup-värde . Det specifika heltalsvärde som valts för att identifiera ExclusionGroup är inte betydande.

    Anmärkning

    Du kan också använda ett egenskapsvärde som inte är noll för ExclusionGroup med ett enda utdata när du inte vill mata ut alla rader. I det här fallet måste du dock uttryckligen anropa metoden DirectRowTo<outputbuffer> för varje rad som du vill skicka till utdata.

  • Du kanske vill tilldela utdata ett eget namn. Senare refererar du till utdata efter deras namn i skriptet med hjälp av de typinskrivna åtkomstegenskaperna som skapats åt dig i den automatiskt genererade koden.

  • Normalt har flera utdata i samma ExclusionGroup samma utdatakolumner. Men om du skapar ett simulerat felutdata kanske du vill lägga till fler kolumner för att lagra felinformation. Information om hur dataflödesmotorn bearbetar felrader finns i Använda felutdata i en dataflödeskomponent. I skriptkomponenten måste du dock skriva din egen kod för att fylla de ytterligare kolumnerna med lämplig felinformation. Mer information finns i Simulera ett felutdata för skriptkomponenten.

Mer information om sidan Indata och utdata i skripttransformeringsredigeraren finns i Redigeraren för skripttransformering (indata och utdata).

Lägga till variabler

Om det finns befintliga variabler vars värden du vill använda i skriptet kan du lägga till dem i egenskapsfälten ReadOnlyVariables och ReadWriteVariablespå skriptsidan i redigeraren för skripttransformering.

När du anger flera variabler i egenskapsfälten separerar du variabelnamnen med kommatecken. Du kan också ange flera variabler genom att klicka på ellipsknappen (...) bredvid egenskapsfälten ReadOnlyVariables och ReadWriteVariables och välja variabler i dialogrutan Välj variabler .

Allmän information om hur du använder variabler med skriptkomponenten finns i Använda variabler i skriptkomponenten.

Mer information om skriptsidan i skripttransformeringsredigeraren finns i Skripttransformeringsredigeraren (skriptsida).

Skripta en källkomponent i Code-Design läge

När du har konfigurerat metadata för din komponent öppnar du IDE:t Microsoft Visual Studio Tools for Applications (VSTA) för att koda ditt anpassade skript. Öppna VSTA genom att klicka på Redigera skript på sidan Skript i redigeraren för skripttransformering. Du kan skriva skriptet med hjälp av antingen Microsoft Visual Basic eller Microsoft Visual C#, beroende på skriptspråket som valts för egenskapen ScriptLanguage .

Viktig information som gäller för alla typer av komponenter som skapas med hjälp av skriptkomponenten finns i Koda och felsöka skriptkomponenten.

Förstå den automatiskt genererade koden

När du öppnar VSTA IDE när du har skapat och konfigurerat en källkomponent visas den redigerbara ScriptMain-klassen i kodredigeraren. Du skriver din anpassade kod i klassen ScriptMain .

Klassen ScriptMain innehåller en stub för metoden CreateNewOutputRows. CreateNewOutputRows är den viktigaste metoden i en källkomponent.

Om du öppnar Project Explorer-fönstret i VSTA kan du se att skriptkomponenten också har genererat skrivskyddade BufferWrapper - och ComponentWrapper-projektobjekt . Klassen ScriptMain ärver från klassen UserComponent i projektobjektet ComponentWrapper.

Vid körning anropar dataflödesmotorn primeoutput-metoden i klassen UserComponent , som åsidosätter metoden för PrimeOutput den ScriptComponent överordnade klassen. PrimeOutput-metoden anropar i sin tur följande metoder:

  1. Metoden CreateNewOutputRows , som du åsidosätter i ScriptMain för att lägga till rader från datakällan till utdatabuffertarna, som först är tomma.

  2. Metoden FinishOutputs , som är tom som standard. Åsidosätt den här metoden i ScriptMain för att utföra den bearbetning som krävs för att slutföra utdata.

  3. Den privata metoden MarkOutputsAsFinished , som anropar SetEndOfRowset metoden för den ScriptBuffer överordnade klassen för att indikera för dataflödesmotorn att utdata är klara. Du behöver inte anropa SetEndOfRowset explicit i din egen kod.

Skriva din anpassade kod

För att slutföra skapandet av en anpassad källkomponent kanske du vill skriva skript i följande metoder som är tillgängliga i klassen ScriptMain .

  1. Åsidosätt metoden AcquireConnections för att ansluta till den externa datakällan. Extrahera anslutningsobjektet, eller nödvändig anslutningsinformation, från anslutningshanteraren.

  2. Åsidosätt metoden PreExecute för att läsa in data, om du kan läsa in alla källdata samtidigt. Du kan till exempel köra en SqlCommand mot en ADO.NET anslutning till en SQL Server-databas och läsa in alla källdata samtidigt i en SqlDataReader. Om du måste läsa in källdata en rad i taget (till exempel när du läser en textfil) kan du läsa in data när du loopar igenom rader i CreateNewOutputRows.

  3. Använd metoden CreateNewOutputRows för att lägga till nya rader i de tomma utdatabuffertarna och fylla i värdena för varje kolumn i de nya utdataraderna. Använd metoden AddRow för varje utdatabuffert för att lägga till en tom ny rad och ange sedan värdena för varje kolumn. Vanligtvis kopierar du värden från kolumnerna som läses in från den externa källan.

  4. Åsidosätt PostExecute-metoden för att slutföra bearbetningen av data. Du kan till exempel stänga den SqlDataReader som du använde för att läsa in data.

  5. Åsidosätt metoden ReleaseConnections för att koppla från den externa datakällan om det behövs.

Exempel

I följande exempel visas den anpassade kod som krävs i klassen ScriptMain för att skapa en källkomponent.

Anmärkning

I de här exemplen används tabellen Person.Address i AdventureWorks-exempeldatabasen och skickar dess första och fjärde kolumner, kolumnerna intAddressID och nvarchar(30)City , via dataflödet. Samma data används i käll-, transformerings- och målexempel i det här avsnittet. Ytterligare förutsättningar och antaganden dokumenteras för varje exempel.

ADO.NET källexempel

Det här exemplet visar en källkomponent som använder en befintlig ADO.NET anslutningshanteraren för att läsa in data från en SQL Server-tabell till dataflödet.

Om du vill köra den här exempelkoden måste du konfigurera paketet och komponenten på följande sätt:

  1. Skapa en ADO.NET anslutningshanterare som använder SqlClient-providern för att ansluta till AdventureWorks-databasen .

  2. Lägg till en ny skriptkomponent på dataflödesdesignerns yta och konfigurera den som en källa.

  3. Öppna redigeraren för skripttransformering. På sidan Indata och utdata byter du namn på standardutdata med ett mer beskrivande namn, till exempel MyAddressOutput, och lägger till och konfigurerar de två utdatakolumnerna AddressID och City.

    Anmärkning

    Se till att ändra datatypen för utdatakolumnen Stad till DT_WSTR.

  4. På sidan Anslutningshanterare lägger du till eller skapar ADO.NET anslutningshanteraren och ger den ett namn som MyADONETConnection.

  5. På sidan Skript klickar du på Redigera skript och anger det skript som följer. Stäng sedan skriptutvecklingsmiljön och skripttransformeringsredigeraren.

  6. Skapa och konfigurera en målkomponent, till exempel ett SQL Server-mål eller exempelmålkomponenten som visas i Skapa ett mål med skriptkomponenten, som förväntar sig kolumnerna AddressID och City . Anslut sedan källkomponenten till målet. (Du kan ansluta en källa direkt till ett mål utan transformeringar.) Du kan skapa en måltabell genom att köra följande Transact-SQL kommando i AdventureWorks-databasen :

    CREATE TABLE [Person].[Address2]([AddressID] [int] NOT NULL,  
        [City] [nvarchar](30) NOT NULL)  
    
  7. Utför exemplet.

    Imports Microsoft.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 Microsoft.Data.SqlClient;  
    public class ScriptMain:  
        UserComponent  
    
    {  
        IDTSConnectionManager100 connMgr;  
        SqlConnection sqlConn;  
        SqlDataReader sqlReader;  
    
        public override void AcquireConnections(object Transaction)  
        {  
            connMgr = this.Connections.MyADONETConnection;  
            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);  
    
        }  
    
    }  
    

Exempel på flat filkälla

Det här exemplet visar en källkomponent som använder en befintlig flat filanslutningshanterare för att läsa in data från en platt fil till dataflödet. Flata filkälldata skapas genom att exportera dem från SQL Server.

Om du vill köra den här exempelkoden måste du konfigurera paketet och komponenten på följande sätt:

  1. Använd guiden Importera och exportera SQL Server för att exportera tabellen Person.Address från AdventureWorks-exempeldatabasen till en kommaavgränsad flat fil. Det här exemplet använder filnamnet ExportedAddresses.txt.

  2. Skapa en flat filanslutningshanterare som ansluter till den exporterade datafilen.

  3. Lägg till en ny skriptkomponent på dataflödesdesignerns yta och konfigurera den som en källa.

  4. Öppna redigeraren för skripttransformering. På sidan Indata och utdata byter du namn på standardutdata med ett mer beskrivande namn, till exempel MyAddressOutput. Lägg till och konfigurera de två utdatakolumnerna AddressID och City.

  5. På sidan Anslutningshanterare lägger du till eller skapar anslutningshanteraren för flat fil med ett beskrivande namn som MyFlatFileSrcConnectionManager.

  6. På sidan Skript klickar du på Redigera skript och anger det skript som följer. Stäng sedan skriptutvecklingsmiljön och skripttransformeringsredigeraren.

  7. Skapa och konfigurera en målkomponent, till exempel ett SQL Server-mål, eller exempelmålkomponenten som visas i Skapa ett mål med skriptkomponenten. Anslut sedan källkomponenten till målet. (Du kan ansluta en källa direkt till ett mål utan transformeringar.) Du kan skapa en måltabell genom att köra följande Transact-SQL kommando i AdventureWorks-databasen :

    CREATE TABLE [Person].[Address2]([AddressID] [int] NOT NULL,  
        [City] [nvarchar](30) NOT NULL)  
    
  8. Utför exemplet.

    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();  
    
        }  
    
    }  
    

Skapa ett mål med skriptkomponenten
Utveckla en anpassad källkomponent