Creazione di una destinazione con il componente script

Utilizzare un componente di destinazione nel flusso di dati di un pacchetto di Integration Services per salvare in un'origine dati i dati ricevuti dalle origini e dalle trasformazioni upstream. Normalmente, il componente di destinazione si connette all'origine dati tramite una gestione connessione esistente.

Per una panoramica del componente script, vedere Estensione del flusso di dati con il componente script.

Il componente script e il codice dell'infrastruttura che genera semplificano in modo significativo il processo di sviluppo di un componente del flusso di dati personalizzato. Tuttavia, per comprendere il funzionamento del componente script, può risultare utile leggere informazioni sui passaggi necessari per lo sviluppo di un componente del flusso di dati personalizzato nella sezione Sviluppo di un componente del flusso di dati personalizzato, in particolare Sviluppo di un componente di destinazione personalizzato.

Introduzione ai componenti di destinazione

Quando si aggiunge un componente script nella scheda Flusso di dati di Progettazione SSIS, viene visualizzata la finestra di dialogo Seleziona tipo componente script in cui si richiede di selezionare uno script Origine, Destinazione o Trasformazione. In questa finestra di dialogo selezionare Destinazione.

Connettere quindi l'output di una trasformazione al componente di destinazione in Progettazione SSIS. A scopo di test, è possibile connettere direttamente un'origine a una destinazione senza alcuna trasformazione.

Configurazione di un componente di destinazione in modalità di progettazione metadati

Dopo aver selezionato l'opzione per creare un componente di destinazione, configurare il componente utilizzando Editor trasformazione Script. Per ulteriori informazioni, vedere Configurazione del componente script nell'editor corrispondente.

Per selezionare il linguaggio di scripting che verrà utilizzato dal componente script di destinazione, impostare la proprietà ScriptLanguage nella pagina Script della finestra di dialogo Editor trasformazione Script.

[!NOTA]

Per impostare il linguaggio di scripting predefinito per il componente script, utilizzare l'opzione Linguaggio di scripting nella pagina Generale della finestra di dialogo Opzioni. Per ulteriori informazioni, vedere Pagina Generale.

Un componente di destinazione del flusso di dati include un input e nessun output. La configurazione dell'input per il componente è uno dei passaggi che è necessario completare in modalità di progettazione metadati, tramite Editor trasformazione Script, prima di scrivere lo script personalizzato.

Aggiunta di gestioni connessioni

Normalmente, un componente di destinazione utilizza una gestione connessione esistente per connettersi all'origine dati in cui salva i dati dal flusso di dati. Nella pagina Gestioni connessioni di Editor trasformazione Script fare clic su Aggiungi per aggiungere la gestione connessione appropriata.

Tuttavia, una gestione connessione è solo un'unità pratica che incapsula e archivia le informazioni necessarie per la connessione a un'origine dati di un determinato tipo. È necessario scrivere codice personalizzato per caricare o salvare i dati e possibilmente per aprire e chiudere la connessione all'origine dati.

Per informazioni generali sull'utilizzo delle gestioni connessioni con il componente script, vedere Connessione a origini dati nel componente script.

Per ulteriori informazioni sulla pagina Gestioni connessioni di Editor trasformazione Script, vedere Editor trasformazione Script (pagina Gestioni connessioni).

Configurazione di input e colonne di input

Un componente di destinazione include un input e nessun output.

Nella pagina Colonne di input di Editor trasformazione Script l'elenco di colonne contiene le colonne disponibili dell'output del componente a monte nel flusso di dati. Selezionare le colonne da salvare.

Per ulteriori informazioni sulla pagina Colonne di input di Editor trasformazione Script, vedere Editor trasformazione Script (pagina Colonne di input).

La pagina Input e output di Editor trasformazione Script contiene un unico input, che è possibile rinominare. Si farà riferimento all'input in base al relativo nome nello script utilizzando la proprietà della funzione di accesso creata nel codice generato automaticamente.

Per ulteriori informazioni sulla pagina Input e output di Editor trasformazione Script, vedere Editor trasformazione Script (pagina Input e output).

Aggiunta di variabili

Se si desidera utilizzare nello script le variabili esistenti, è possibile aggiungerle nei campi delle proprietà ReadOnlyVariables e ReadWriteVariables nella pagina Script di Editor trasformazione Script.

Quando si aggiungono più variabili nei campi delle proprietà, separare i relativi nomi con virgole. È inoltre possibile selezionare più variabili facendo clic sul pulsante con i puntini di sospensione () accanto ai campi delle proprietà ReadOnlyVariables e ReadWriteVariables e selezionando le variabili nella finestra di dialogo Seleziona variabili.

Per informazioni generali sull'utilizzo delle variabili con il componente script, vedere Utilizzo di variabili nel componente script.

Per ulteriori informazioni sulla pagina Script di Editor trasformazione Script, vedere Editor trasformazione Script (pagina Script).

Generazione di script per un componente di destinazione in modalità di progettazione codice

Dopo aver configurato i metadati per il componente, è possibile scrivere lo script personalizzato. Nella pagina Script di Editor trasformazione Script fare clic su Modifica script per aprire l'IDE di Microsoft Visual Studio Tools for Applications (VSTA), in cui è possibile aggiungere lo script personalizzato. Il linguaggio di scripting che si utilizza varia a seconda che sia stato selezionato Microsoft Visual Basic o Microsoft Visual C# come linguaggio di scripting per la proprietà ScriptLanguage nella pagina Script.

Per importanti informazioni applicabili a tutti i tipi di componenti creati tramite il componente script, vedere Codifica e debug del componente script.

Informazioni sul codice generato automaticamente

Quando si apre l'IDE di VSTA dopo la creazione e la configurazione di un componente di destinazione, la classe ScriptMain modificabile viene visualizzata nell'editor del codice con uno stub per il metodo ProcessInputRow. La classe ScriptMain è quella in cui si scriverà il codice personalizzato, mentre ProcessInputRow è il metodo più importante in un componente di destinazione.

Se si apre la finestra Esplora progetti in VSTA, è possibile rilevare che il componente script ha generato anche gli elementi del progetto BufferWrapper e ComponentWrapper di sola lettura. La classe ScriptMain eredita dalla classe UserComponent nell'elemento di progetto ComponentWrapper.

In fase di esecuzione il motore flusso di dati richiama il metodo ProcessInput nella classe UserComponent, che esegue l'override del metodo ProcessInput della classe padre ScriptComponent. Il metodo ProcessInput a sua volta esegue il ciclo delle righe nel buffer di input e chiama il metodo ProcessInputRow una volta per ogni riga.

Scrittura di codice personalizzato

Per completare la creazione di un componente di destinazione personalizzato, è possibile scrivere script nei metodi seguenti disponibili nella classe ScriptMain.

  1. Eseguire l'override del metodo AcquireConnections per connettersi all'origine dati esterna. Estrarre l'oggetto connessione o le informazioni di connessione necessarie dalla gestione connessione.

  2. Eseguire l'override del metodo PreExecute per prepararsi al salvataggio dei dati. Ad esempio, è possibile creare e configurare un oggetto SqlCommand e i relativi parametri in questo metodo.

  3. Utilizzare il metodo ProcessInputRow sottoposto a override per copiare ogni riga di input nell'origine dati esterna. Ad esempio, per una destinazione di SQL Server, è possibile copiare i valori delle colonne nei parametri di un oggetto SqlCommand ed eseguire il comando una volta per ogni riga. Per una destinazione file flat, è possibile scrivere i valori per ogni colonna in un oggetto StreamWriter, separandoli con il delimitatore di colonna.

  4. Eseguire l'override del metodo PostExecute per disconnettersi dall'origine dati esterna, se necessario, e per eseguire eventuali altre operazioni di pulizia richieste.

Esempi

Negli esempi seguenti è illustrato il codice necessario nella classe ScriptMain per creare un componente di destinazione.

[!NOTA]

Negli esempi viene utilizzata la tabella Person.Address del database di esempio AdventureWorks e vengono passate la prima e la quarta colonna, ovvero int AddressID e nvarchar(30) City, attraverso il flusso di dati. Gli stessi dati vengono utilizzati negli esempi relativi a origine, trasformazione e destinazione in questa sezione. Per ogni esempio, sono documentati ulteriori prerequisiti e presupposti.

Esempio di destinazione ADO.NET

In questo esempio è illustrato un componente di destinazione che utilizza una gestione connessione ADO.NET esistente per salvare i dati del flusso di dati in una tabella di SQL Server.

Se si desidera eseguire questo codice di esempio, è necessario configurare il pacchetto e il componente come segue:

  1. Creare una gestione connessione ADO.NET che utilizza il provider SqlClient per connettersi al database AdventureWorks.

  2. Creare una tabella di destinazione eseguendo il comando Transact-SQL seguente nel database AdventureWorks:

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    )
    
  3. Aggiungere un nuovo componente script all'area di progettazione del flusso di dati e configurarlo come destinazione.

  4. Connettere l'output di un'origine o di una trasformazione a monte al componente di destinazione in Progettazione SSIS. È possibile connettere direttamente un'origine a una destinazione senza alcuna trasformazione. Questo output deve fornire i dati della tabella Person.Address del database di esempio AdventureWorks che contiene almeno le colonne AddressID e City.

  5. Aprire Editor trasformazione Script. Nella pagina Colonne di input selezionare le colonne di input AddressID e City.

  6. Nella pagina Input e output rinominare l'input con un nome più descrittivo, ad esempio MyAddressInput.

  7. Nella pagina Gestioni connessioni aggiungere o creare la gestione connessione ADO.NET e specificare un nome, ad esempio MyADONETConnectionManager.

  8. Nella pagina Script fare clic su Modifica script e immettere lo script seguente. Quindi, chiudere l'ambiente di sviluppo dello script.

  9. Chiudere Editor trasformazione Script ed eseguire l'esempio.

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

    }

}

Esempio di destinazione file flat

In questo esempio è illustrato un componente di destinazione che utilizza una gestione connessione file flat esistente per salvare i dati del flusso di dati in un file flat.

Se si desidera eseguire questo codice di esempio, è necessario configurare il pacchetto e il componente come segue:

  1. Creare una gestione connessione file flat che si connette a un file di destinazione. Il file non deve necessariamente esistere, in quanto verrà creato dal componente di destinazione. Configurare il file di destinazione come file delimitato da virgole che contiene le colonne AddressID e City.

  2. Aggiungere un nuovo componente script all'area di progettazione del flusso di dati e configurarlo come destinazione.

  3. Connettere l'output di un'origine o di una trasformazione a monte al componente di destinazione in Progettazione SSIS. È possibile connettere direttamente un'origine a una destinazione senza alcuna trasformazione. Questo output deve fornire i dati della tabella Person.Address del database di esempio AdventureWorks e deve contenere almeno le colonne AddressID e City.

  4. Aprire Editor trasformazione Script. Nella pagina Colonne di input selezionare le colonne AddressID e City.

  5. Nella pagina Input e output rinominare l'input con un nome più descrittivo, ad esempio MyAddressInput.

  6. Nella pagina Gestioni connessioni aggiungere o creare la gestione connessione file flat utilizzando un nome descrittivo, ad esempio MyFlatFileDestConnectionManager.

  7. Nella pagina Script fare clic su Modifica script e immettere lo script seguente. Quindi, chiudere l'ambiente di sviluppo dello script.

  8. Chiudere Editor trasformazione Script ed eseguire l'esempio.

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

    }

}
Icona di Integration Services (piccola) Rimanere aggiornati con Integration Services

Per i download, gli articoli, gli esempi e i video Microsoft più recenti, oltre alle soluzioni selezionate dalla community, visitare la pagina Integration Services sul sito MSDN:


Per ricevere una notifica automatica su questi aggiornamenti, sottoscrivere i feed RSS disponibili nella pagina.

Vedere anche

Concetti

Creazione di un'origine con il componente script

Sviluppo di un componente di destinazione personalizzato