Delen via


De uitvoer van een lokaal pakket laden

van toepassing op:SQL Server SSIS Integration Runtime in Azure Data Factory

Clienttoepassingen kunnen de uitvoer van Integration Services-pakketten lezen wanneer de uitvoer wordt opgeslagen op SQL Server-bestemmingen met behulp van ADO.NET of wanneer de uitvoer wordt opgeslagen op een plat bestandsdoel met behulp van de klassen in de System.IO naamruimte. Een clienttoepassing kan echter ook de uitvoer van een pakket rechtstreeks vanuit het geheugen lezen, zonder dat er een tussenstap nodig is om de gegevens te behouden. De sleutel voor deze oplossing is de Microsoft.SqlServer.Dts.DtsClient naamruimte, die gespecialiseerde implementaties bevat van de IDbConnection-, IDbCommand-en IDbDataParameter interfaces uit de System.Data naamruimte. De assembly-Microsoft.SqlServer.Dts.DtsClient.dll is standaard geïnstalleerd in %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.

Belangrijk

De procedure die in dit artikel wordt beschreven, die gebruikmaakt van de DtsClient-bibliotheek, werkt alleen voor pakketten die zijn geïmplementeerd met het pakketimplementatiemodel (dat wil gezegd, met de optie /SQL, /DTSof /File). Deze procedure werkt niet voor pakketten die zijn geïmplementeerd met het serverimplementatiemodel (dat wil gezegd, met de optie /ISServer). Als u de uitvoer van een lokaal pakket wilt gebruiken dat is geïmplementeerd met het serverimplementatiemodel (met de optie /ISServer), gebruikt u de Doel voor gegevensstreaming in plaats van de procedure die in dit artikel wordt beschreven.

Notitie

Voor de procedure die in dit onderwerp wordt beschreven, moet de eigenschap DelayValidation van de gegevensstroomtaak en van eventuele bovenliggende objecten worden ingesteld op de standaardwaarde van False.

Beschrijving

Deze procedure laat zien hoe u een clienttoepassing ontwikkelt in beheerde code waarmee de uitvoer van een pakket met een DataReader-bestemming rechtstreeks vanuit het geheugen wordt geladen. De stappen die hier worden samengevat, worden gedemonstreerd in het volgende codevoorbeeld.

Uitvoer van gegevenspakketten laden in een clienttoepassing

  1. Configureer in het pakket een DataReader-bestemming om de uitvoer te ontvangen die u wilt lezen in de clienttoepassing. Geef de DataReader-bestemming een beschrijvende naam, omdat u deze naam later in uw clienttoepassing gaat gebruiken. Noteer de naam van de DataReader-bestemming.

  2. Stel in het ontwikkelingsproject een verwijzing in naar de Microsoft.SqlServer.Dts.DtsClient naamruimte door de assembly Microsoft.SqlServer.Dts.DtsClient.dllte zoeken. Deze assembly is standaard geïnstalleerd in C:\Program Files\Microsoft SQL Server\100\DTS\Binn. Importeer de naamruimte in uw code met behulp van de instructie C# Using of the Visual Basic Imports instructie.

  3. Maak in uw code een object van het type DtsClient.DtsConnection met een verbindingsreeks die de opdrachtregelparameters bevat die vereist zijn voor dtexec.exe om het pakket uit te voeren. Zie dtexec Utilityvoor meer informatie. Open vervolgens de verbinding met deze verbindingsreeks. U kunt ook het hulpprogramma dtexecui gebruiken om de vereiste verbindingsreeks visueel te maken.

    Notitie

    De voorbeeldcode laat zien hoe u het pakket vanuit het bestandssysteem laadt met behulp van de /FILE <path and filename> syntaxis. U kunt het pakket echter ook laden vanuit de MSDB-database met behulp van de /SQL <package name> syntaxis of vanuit het Integration Services-pakketarchief met behulp van de /DTS \<folder name>\<package name> syntaxis.

  4. Maak een object van het type DtsClient.DtsCommand- dat gebruikmaakt van de eerder gemaakte DtsConnection- en stel de eigenschap CommandText in op de naam van de DataReader-bestemming in het pakket. Roep vervolgens de ExecuteReader methode van het opdrachtobject aan om de pakketresultaten in een nieuwe DataReader te laden.

  5. U kunt de uitvoer van het pakket indirect parameteriseren met behulp van de verzameling DtsDataParameter--objecten op het DtsCommand--object om waarden door te geven aan variabelen die in het pakket zijn gedefinieerd. In het pakket kunt u deze variabelen gebruiken als queryparameters of in expressies om de resultaten te beïnvloeden die worden geretourneerd naar de DataReader-bestemming. U moet deze variabelen definiëren in het pakket in de DtsClient-naamruimte voordat u deze kunt gebruiken met het DtsDataParameter--object vanuit een clienttoepassing. (Mogelijk moet u in het venster Variabelen op de knop Variabele kolommen kiezen om de naamruimte kolom weer te geven.) Wanneer u in de clientcode een DtsDataParameter- toevoegt aan de verzameling Parameters van de DtsCommand-, laat u de dtsClient-naamruimtereferentie weg uit de naam van de variabele. Bijvoorbeeld:

    command.Parameters.Add(new DtsDataParameter("MyVariable", 1));  
    
  6. Roep de methode Read van de DataReader herhaaldelijk aan als dat nodig is om de rijen met uitvoergegevens te doorlopen. Gebruik de gegevens of sla de gegevens op voor later gebruik in de clienttoepassing.

    Belangrijk

    De methode Read van deze implementatie van DataReader retourneert echte nog één keer nadat de laatste rij met gegevens is gelezen. Dit maakt het moeilijk om de gebruikelijke code te gebruiken die door de DataReader loopt terwijl Lezenechteretourneert. Als uw code probeert de DataReader of de verbinding te sluiten nadat het verwachte aantal rijen is gelezen, zonder een extra aanroep van de methode Read, wordt er een onverwerkte uitzondering gegenereerd. Als uw code echter probeert gegevens te lezen over deze laatste iteratie via een lus, wordt er bij Read nog steeds true geretourneerd, maar de laatste rij is doorgegeven, wordt met de code een niet-verwerkte ApplicationException- met het bericht 'De SSIS IDataReader ligt voorbij het einde van de resultatenset'. Dit gedrag verschilt van die van andere DataReader-implementaties. Als u daarom een lus gebruikt om de rijen in de DataReader te lezen terwijl Lezenwaarretourneert, moet u code schrijven om deze verwachte ApplicationException- te vangen, testen en negeren tijdens de laatste geslaagde aanroep van de methode Read. Als u van tevoren het verwachte aantal rijen weet, kunt u de rijen verwerken en vervolgens de methode Read aanroepen voordat u de DataReader en de verbinding sluit.

  7. Roep de methode Dispose van het DtsCommand--object aan. Dit is met name belangrijk als u DtsDataParameter objecten hebt gebruikt.

  8. Sluit de DataReader en de verbindingsobjecten.

Voorbeeld

In het volgende voorbeeld wordt een pakket uitgevoerd waarmee één geaggregeerde waarde wordt berekend en de waarde wordt opgeslagen op een DataReader-bestemming. Vervolgens wordt deze waarde uit DataReader gelezen en wordt de waarde weergegeven in een tekstvak op een Windows-formulier.

Het gebruik van parameters is niet vereist bij het laden van de uitvoer van een pakket in een clienttoepassing. Als u geen parameter wilt gebruiken, kunt u het gebruik van de variabele weglaten in de DtsClient naamruimte en de code weglaten die gebruikmaakt van het DtsDataParameter--object.

Het testpakket maken

  1. Maak een nieuw Integration Services-pakket. De voorbeeldcode maakt gebruik van DtsClientWParamPkg.dtsx als de naam van het pakket.

  2. Voeg een variabele van het type String toe in de DtsClient-naamruimte. De voorbeeldcode gebruikt Land als de naam van de variabele. (Mogelijk moet u in het venster Variabelen op de knop Variabele kolommen kiezen om de naamruimte kolom weer te geven.)

  3. Voeg een OLE DB-verbindingsbeheerder toe die verbinding maakt met de voorbeelddatabase AdventureWorks2022.

  4. Voeg een gegevensstroomtaak toe aan het pakket en schakel over naar het ontwerpoppervlak voor gegevensstromen.

  5. Voeg een OLE DB-bron toe aan de gegevensstroom en configureer deze om het OLE DB-verbindingsbeheer te gebruiken dat u eerder hebt gemaakt en de volgende SQL-opdracht:

    SELECT * FROM Sales.vIndividualCustomer WHERE CountryRegionName = ?  
    
  6. Klik op Parameters en wijs in het dialoogvenster Queryparameters instellen de enkele invoerparameter in de query Parameter0 toe aan de variabele DtsClient::Country.

  7. Voeg een statistische transformatie toe aan de gegevensstroom en koppel de uitvoer van de OLE DB-bron aan de transformatie. Open de editor voor samenvoegingstransformatie en configureer deze om een bewerking 'Alle tellen' uit te voeren op alle invoerkolommen (*) en om de geaggregeerde waarde uit te voeren met de alias CustomerCount.

  8. Voeg een DataReader-bestemming toe aan de gegevensstroom en verbind de uitvoer van de statistische transformatie met de DataReader-bestemming. In de voorbeeldcode wordt 'DataReaderDest' gebruikt als de naam van de DataReader. Selecteer de enkele beschikbare invoerkolom, CustomerCount, voor de bestemming.

  9. Sla het pakket op. De testtoepassing die vervolgens wordt gemaakt, voert het pakket uit en haalt de uitvoer rechtstreeks op uit het geheugen.

De testtoepassing maken

  1. Maak een nieuwe Windows Forms-toepassing.

  2. Voeg een verwijzing toe naar de Microsoft.SqlServer.Dts.DtsClient naamruimte door te bladeren naar de assembly van dezelfde naam in %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.

  3. Kopieer en plak de volgende voorbeeldcode in de codemodule voor het formulier.

  4. Wijzig de waarde van de dtexecArgs variabele zoals vereist, zodat deze de opdrachtregelparameters bevat die zijn vereist voor dtexec.exe om het pakket uit te voeren. Met de voorbeeldcode wordt het pakket vanuit het bestandssysteem geladen.

  5. Wijzig de waarde van de variabele dataReaderName, zodat deze de naam van de DataReader-bestemming in het pakket bevat.

  6. Plaats een knop en een tekstvak op het formulier. De voorbeeldcode gebruikt btnRun als de naam van de knop en txtResults als de naam van het tekstvak.

  7. Voer de toepassing uit en klik op de knop. Na een korte pauze terwijl het pakket wordt uitgevoerd, ziet u de cumulatieve waarde die wordt berekend door het pakket (het aantal klanten in Canada) dat wordt weergegeven in het tekstvak op het formulier.

Voorbeeldcode

Imports System.Data  
Imports Microsoft.SqlServer.Dts.DtsClient  
  
Public Class Form1  
  
  Private Sub btnRun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRun.Click  
  
    Dim dtexecArgs As String  
    Dim dataReaderName As String  
    Dim countryName As String  
  
    Dim dtsConnection As DtsConnection  
    Dim dtsCommand As DtsCommand  
    Dim dtsDataReader As IDataReader  
    Dim dtsParameter As DtsDataParameter  
  
    Windows.Forms.Cursor.Current = Cursors.WaitCursor  
  
    dtexecArgs = "/FILE ""C:\...\DtsClientWParamPkg.dtsx"""  
    dataReaderName = "DataReaderDest"  
    countryName = "Canada"  
  
    dtsConnection = New DtsConnection()  
    With dtsConnection  
      .ConnectionString = dtexecArgs  
      .Open()  
    End With  
  
    dtsCommand = New DtsCommand(dtsConnection)  
    dtsCommand.CommandText = dataReaderName  
  
    dtsParameter = New DtsDataParameter("Country", DbType.String)  
    dtsParameter.Direction = ParameterDirection.Input  
    dtsCommand.Parameters.Add(dtsParameter)  
  
    dtsParameter.Value = countryName  
  
    dtsDataReader = dtsCommand.ExecuteReader(CommandBehavior.Default)  
  
    With dtsDataReader  
      .Read()  
      txtResults.Text = .GetInt32(0).ToString("N0")  
    End With  
  
    'After reaching the end of data rows,  
    ' call the Read method one more time.  
    Try  
      dtsDataReader.Read()  
    Catch ex As Exception  
      MessageBox.Show("Exception on final call to Read method:" & ControlChars.CrLf & _  
      ex.Message & ControlChars.CrLf & _  
      ex.InnerException.Message, "Exception on final call to Read method", _  
      MessageBoxButtons.OK, MessageBoxIcon.Error)  
    End Try  
  
    ' The following method is a best practice, and is  
    '  required when using DtsDataParameter objects.  
    dtsCommand.Dispose()  
  
    Try  
      dtsDataReader.Close()  
    Catch ex As Exception  
      MessageBox.Show("Exception closing DataReader:" & ControlChars.CrLf & _  
      ex.Message & ControlChars.CrLf & _  
      ex.InnerException.Message, "Exception closing DataReader", _  
      MessageBoxButtons.OK, MessageBoxIcon.Error)  
    End Try  
  
    Try  
      dtsConnection.Close()  
    Catch ex As Exception  
      MessageBox.Show("Exception closing connection:" & ControlChars.CrLf & _  
      ex.Message & ControlChars.CrLf & _  
      ex.InnerException.Message, "Exception closing connection", _  
      MessageBoxButtons.OK, MessageBoxIcon.Error)  
    End Try  
  
    Windows.Forms.Cursor.Current = Cursors.Default  
  
  End Sub  
  
End Class  
using System;  
using System.Windows.Forms;  
using System.Data;  
using Microsoft.SqlServer.Dts.DtsClient;  
  
namespace DtsClientWParamCS  
{  
  public partial class Form1 : Form  
  {  
    public Form1()  
    {  
      InitializeComponent();  
      this.btnRun.Click += new System.EventHandler(this.btnRun_Click);  
    }  
  
    private void btnRun_Click(object sender, EventArgs e)  
    {  
      string dtexecArgs;  
      string dataReaderName;  
      string countryName;  
  
      DtsConnection dtsConnection;  
      DtsCommand dtsCommand;  
      IDataReader dtsDataReader;  
      DtsDataParameter dtsParameter;  
  
      Cursor.Current = Cursors.WaitCursor;  
  
      dtexecArgs = @"/FILE ""C:\...\DtsClientWParamPkg.dtsx""";  
      dataReaderName = "DataReaderDest";  
      countryName = "Canada";  
  
      dtsConnection = new DtsConnection();  
      {  
        dtsConnection.ConnectionString = dtexecArgs;  
        dtsConnection.Open();  
      }  
  
      dtsCommand = new DtsCommand(dtsConnection);  
      dtsCommand.CommandText = dataReaderName;  
  
      dtsParameter = new DtsDataParameter("Country", DbType.String);  
      dtsParameter.Direction = ParameterDirection.Input;  
      dtsCommand.Parameters.Add(dtsParameter);  
  
      dtsParameter.Value = countryName;  
  
      dtsDataReader = dtsCommand.ExecuteReader(CommandBehavior.Default);  
  
      {  
        dtsDataReader.Read();  
        txtResults.Text = dtsDataReader.GetInt32(0).ToString("N0");  
      }  
  
      //After reaching the end of data rows,  
      // call the Read method one more time.  
      try  
      {  
        dtsDataReader.Read();  
      }  
      catch (Exception ex)  
      {  
        MessageBox.Show(  
          "Exception on final call to Read method:\n" + ex.Message + "\n" + ex.InnerException.Message,  
          "Exception on final call to Read method", MessageBoxButtons.OK, MessageBoxIcon.Error);  
      }  
  
      // The following method is a best practice, and is  
      //  required when using DtsDataParameter objects.  
      dtsCommand.Dispose();  
  
      try  
      {  
        dtsDataReader.Close();  
      }  
      catch (Exception ex)  
      {  
        MessageBox.Show(  
          "Exception closing DataReader:\n" + ex.Message + "\n" + ex.InnerException.Message,  
          "Exception closing DataReader", MessageBoxButtons.OK, MessageBoxIcon.Error);  
      }  
  
      try  
      {  
        dtsConnection.Close();  
      }  
      catch (Exception ex)  
      {  
        MessageBox.Show(  
          "Exception closing connection:\n" + ex.Message + "\n" + ex.InnerException.Message,  
          "Exception closing connection", MessageBoxButtons.OK, MessageBoxIcon.Error);  
      }  
  
      Cursor.Current = Cursors.Default;  
  
    }  
  }  
}  

Zie ook

inzicht in de verschillen tussen lokale en externe uitvoering
programmatisch een lokaal pakket laden en uitvoeren
programmatisch een extern pakket laden en uitvoeren