SSIS Script Component Source – własne źródło danych

2012-07-22

W dzisiejszym temacie omówię tworzenie własnego źródła danych w Integration Services za pomocą skryptu C#. Do tego celu służy komponent Script (Script Component). Po dodaniu go do elementu Data Flow, należy skonfigurować kilka opcji:

1. Skrypt ustawiamy jako źródło danych:

2. W sekcji Script poprzez właściwości ReadOnlyVariables i ReadWriteVariables udostępniamy dla skryptu zmienne:


3. W sekcji Inputs and Outputs określamy nazwę wyjściowego zbioru danych oraz definiujemy dla niego listę kolumn (możemy utworzyć więcej niż jeden zbiór):

4. W sekcji Connection Managers udostępniamy dla skryptu istniejące połączenia (oczywiście jeżeli chcemy z nich skorzystać):

Po skonfigurowaniu komponentu klikamy na Edit Script (sekcja Script) i przechodzimy do edycji kodu C#. Skrypt składa się z klasy ScriptMain, w której implementujemy określone metody w celu przygotowania i udostępnienia danych. Są to metody:

  • AcquireConnections – metoda, w której możemy nawiązać połączenie z zewnętrznym źródłem (możemy zdefiniować nowe połączenie lub wykorzystać udostępnione, w drugim przypadku używamy obiektu Connections zawierającego listę połączeń oraz metody AcquireConnection udostępniającej konkretne połączenie);
  • PreExecute – metoda wykonywana jest przed rozpoczęciem procesu przetwarzania danych, tutaj najlepiej przygotować dane, które mają być udostępnione;
  • CreateNewOutputRows – metoda tworząca wyjściowy zbiór danych (wywołanie metody AddRow na wyjściowym zbiorze dodaje do niego nowy rekord, dla którego następnie należy uzupełnić dane), do zbioru odwołujemy się poprzez <nazwa_zbioru>Buffer;
  • PostExecute – metoda wykonywana po przygotowaniu wynikowego zbioru danych, tutaj najlepiej zwalniać obiekty użyte do jego przygotowania;
  • ReleaseConnections – w tej metodzie należy zamknąć połączenia do zewnętrznych źródeł;

Wszystkie dostępne metody: ScriptComponent Class

Oto przykład prostego skryptu pobierającego i udostępniającego zbiór z bazy danych:

using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    IDTSConnectionManager100 connectionManager;
    SqlConnection sqlConnection;
    SqlDataReader dataReader;

    public override void AcquireConnections(object Transaction)
    {
        connectionManager = this.Connections.DBConnection;
        sqlConnection = (SqlConnection)connectionManager.AcquireConnection(null);
    }

    public override void PreExecute()
    {
        base.PreExecute();
        int id = Variables.Id;
        SqlCommand sqlCommand = new SqlCommand(
            "select Id, Name from Table_A where Id >= " + id.ToString(), sqlConnection);
        dataReader = sqlCommand.ExecuteReader();
    }

    public override void CreateNewOutputRows()
    {
        while (dataReader.Read())
        {
            OutputDataBuffer.AddRow();
            OutputDataBuffer.Id = Convert.ToInt32(dataReader["Id"]);
            OutputDataBuffer.Name = Convert.ToString(dataReader["Name"]);
        }
    }

    public override void PostExecute()
    {
        base.PostExecute();
        dataReader.Close();
    }

    public override void ReleaseConnections()
    {
        connectionManager.ReleaseConnection(sqlConnection);
    }

    /* This script component can fire events.
     *
     * Example of firing an error event:
     *  ComponentMetaData.FireError(10, "Process Values", "Bad value", "", 0, out cancel);
     *
     * Example of firing an information event:
     *  ComponentMetaData.FireInformation(10, "Process Values", "Start", "", 0, fireAgain);
     *
     * Example of firing a warning event:
     *  ComponentMetaData.FireWarning(10, "Process Values", "No rows were received", "", 0);
     */
}

W zakomentowanym fragmencie znajdują się przykłady wywoływania zdarzeń podczas działania skryptu.

Więcej informacji na ten temat: MSDN.

Reklamy

Posted on 2012-07-22, in .NET/C# and tagged , , , , . Bookmark the permalink. Dodaj komentarz.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d blogerów lubi to: