Laden der Ausgabe eines lokalen PaketsLoading the Output of a Local Package

Clientanwendungen können die Ausgabe des lesen Integration ServicesIntegration Services Paketen, wenn die Ausgabe in gespeichert ist SQL ServerSQL Server Ziele mit ADO.NETADO.NET, oder wenn die Ausgabe mithilfe der Klassen in in einem Flatfileziel gespeichert wird die System.IO Namespace.Client applications can read the output of Integration ServicesIntegration Services packages when the output is saved to SQL ServerSQL Server destinations by using ADO.NETADO.NET, or when the output is saved to a flat file destination by using the classes in the System.IO namespace. Eine Clientanwendung kann jedoch die Ausgabe eines Pakets auch direkt aus dem Arbeitsspeicher lesen, ohne dass hierfür ein Zwischenschritt zur persistenten Speicherung der Daten erforderlich ist.However, a client application can also read the output of a package directly from memory, without the need for an intermediate step to persist the data. Der Schlüssel für diese Lösung ist die Microsoft.SqlServer.Dts.DtsClient datennamespace, der spezielle Implementierungen der enthält die IDbConnection, IDbCommand, und IDbDataParameter Schnittstellen aus der "System.Data" Namespace.The key to this solution is the Microsoft.SqlServer.Dts.DtsClient namespace, which contains specialized implementations of the IDbConnection, IDbCommand, and IDbDataParameter interfaces from the System.Data namespace. Die Assembly, Microsoft.SqlServer.Dts.DtsClient.dll wird standardmäßig unter installiert %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.The assembly Microsoft.SqlServer.Dts.DtsClient.dll is installed by default in %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.

Hinweis

In diesem Thema beschriebene Vorgehensweise erfordert, dass der DelayValidation-Eigenschaft des Datenflusstasks und alle übergeordneten Objekte auf den Standardwert des "false".The procedure described in this topic requires that the DelayValidation property of the Data Flow task and of any parent objects be set to its default value of False.

DescriptionDescription

In dieser Prozedur wird veranschaulicht, wie eine Clientanwendung in verwaltetem Code entwickelt wird, die die Ausgabe eines Pakets mit einem DataReader-Ziel direkt aus dem Arbeitsspeicher lädt.This procedure demonstrates how to develop a client application in managed code that loads the output of a package with a DataReader destination directly from memory. Die hier zusammengefassten Schritte werden in dem folgenden Codebeispiel veranschaulicht.The steps summarized here are demonstrated in the code sample that follows.

So laden Sie Datenpaketausgabe in eine ClientanwendungTo load data package output into a client application

  1. Konfigurieren Sie in dem Paket ein DataReader-Ziel so, dass die Ausgabe empfangen wird, die in die Clientanwendung gelesen werden soll.In the package, configure a DataReader destination to receive the output that you want to read into the client application. Geben Sie dem DataReader-Ziel einen aussagekräftigen Namen, da Sie diesen Namen später in der Clientanwendung verwenden werden.Give the DataReader destination a descriptive name, since you will use this name later in your client application. Notieren Sie sich den Namen des DataReader-Ziels.Make a note of the name of the DataReader destination.

  2. Legen Sie im Entwicklungsprojekt einen Verweis auf die Microsoft.SqlServer.Dts.DtsClient Namespace durch Assemblysuche Microsoft.SqlServer.Dts.DtsClient.dll.In the development project, set a reference to the Microsoft.SqlServer.Dts.DtsClient namespace by locating the assembly Microsoft.SqlServer.Dts.DtsClient.dll. Standardmäßig wird diese Assembly im installiert C:\Program Files\Microsoft SQL Server\100\DTS\Binn.By default, this assembly is installed in C:\Program Files\Microsoft SQL Server\100\DTS\Binn. Importieren Sie den Namespace in Ihren Code mithilfe von C#- Using oder Visual BasicVisual Basic Importe Anweisung.Import the namespace into your code by using the C# Using or the Visual BasicVisual Basic Imports statement.

  3. In Ihrem Code erstellen Sie ein Objekt des Typs DtsClient.DtsConnection mit einer Verbindungszeichenfolge, die die erforderlichen Befehlszeilenparameter enthält dtexec.exe zum Ausführen des Pakets.In your code, create an object of type DtsClient.DtsConnection with a connection string that contains the command-line parameters required by dtexec.exe to run the package. Weitere Informationen finden Sie unter dtexec Utility.For more information, see dtexec Utility. Öffnen Sie dann die Verbindung mit dieser Verbindungszeichenfolge an.Then open the connection with this connection string. Sie können auch die Dtexecui -Hilfsprogramms die erforderliche Verbindungszeichenfolge visuell zu erstellen.You can also use the dtexecui utility to create the required connection string visually.

    Hinweis

    Im Beispielcode wird das Laden des Pakets aus dem Dateisystem mithilfe der /FILE <path and filename>-Syntax veranschaulicht.The sample code demonstrates loading the package from the file system by using the /FILE <path and filename> syntax. Aber auch Laden des Pakets aus der MSDB-Datenbank mithilfe von können die /SQL <package name> Syntax, oder aus der Integration ServicesIntegration Services Paketspeicher mithilfe der /DTS \<folder name>\<package name> Syntax.However you can also load the package from the MSDB database by using the /SQL <package name> syntax, or from the Integration ServicesIntegration Services package store by using the /DTS \<folder name>\<package name> syntax.

  4. Erstellen Sie ein Objekt des Typs DtsClient.DtsCommand , verwendet das zuvor erstellte ' dtsconnection ' und legen Sie dessen CommandText -Eigenschaft auf den Namen des DataReader Ziel des Pakets.Create an object of type DtsClient.DtsCommand that uses the previously created DtsConnection and set its CommandText property to the name of the DataReader destination in the package. Rufen Sie anschließend die ExecuteReader Methode für das Command-Objekt, um die Paketergebnisse in ein neues DataReader-Ziel zu laden.Then call the ExecuteReader method of the command object to load the package results into a new DataReader.

  5. Optional können Sie die Ausgabe des Pakets indirekt parametrisieren, indem Sie die Auflistung der DtsDataParameter Objekte auf der DtsCommand Objekt Werte an im Paket definierte Variablen übergeben.Optionally, you can indirectly parameterize the output of the package by using the collection of DtsDataParameter objects on the DtsCommand object to pass values to variables defined in the package. Innerhalb des Pakets können Sie diese Variablen als Abfrageparameter oder in Ausdrücken verwenden, um die an das DataReader-Ziel zurückgegebenen Ergebnisse zu beeinflussen.Within the package, you can use these variables as query parameters or in expressions to affect the results returned to the DataReader destination. Sie müssen diese Variablen definieren, in das Paket in der DtsClient Namespace, bevor Sie sie mit verwenden können die DtsDataParameter Objekt von einer Clientanwendung.You must define these variables in the package in the DtsClient namespace before you can use them with the DtsDataParameter object from a client application. (Müssen Sie möglicherweise klicken Sie auf die Variablenspalten Symbolleisten-Schaltfläche in der Variablen Fenster zum Anzeigen der Namespace Spalte.) In Ihrem Client-Code beim Hinzufügen einer DtsDataParameter auf die Parameter Auflistung von der DtsCommand, lassen Sie den DtsClient-Namespaceverweis aus dem Variablennamen .(You may need to click the Choose Variable Columns toolbar button in the Variables window to display the Namespace column.) In your client code, when you add a DtsDataParameter to the Parameters collection of the DtsCommand, omit the DtsClient namespace reference from the variable name. Beispiel:For example:

    command.Parameters.Add(new DtsDataParameter("MyVariable", 1));  
    
  6. Rufen Sie die lesen -Methode des DataReader wiederholt Bedarf so durchlaufen Sie die Zeilen der Ausgabedaten.Call the Read method of the DataReader repeatedly as needed to loop through the rows of output data. Verwenden Sie die Daten, oder speichern Sie die Daten zur späteren Verwendung in der Clientanwendung.Use the data, or save the data for later use, in the client application.

    Wichtig

    Die lesen dieser Implementierung des DataReader Methodenrückgabe "true" ein weiteres Mal, nachdem die letzte Zeile der Daten gelesen wurde.The Read method of this implementation of the DataReader returns true one more time after the last row of data has been read. Dadurch ist es schwierig, den normalen Code zu verwenden, der dem DataReader durchläuft lesen gibt "true".This makes it difficult to use the usual code that loops through the DataReader while Read returns true. Wenn Ihr Code versucht, den DataReader oder die Verbindung nach dem Lesen der erwarteten Anzahl von Zeilen, ohne einen weiteren finalen Aufruf zum Schließen der lesen -Methode, der Code wird eine nicht behandelte Ausnahme ausgelöst.If your code attempts to close the DataReader or the connection after reading the expected number of rows, without an additional, final call to the Read method, the code will raise an unhandled exception. Jedoch, wenn Ihr Code versucht wird, zum Lesen von Daten bei dieser letzten Iteration durch eine Schleife beim lesen dennoch zurück "true" jedoch die letzte Zeile übergeben wurde, gibt der Code löst ein nicht behandeltes ApplicationException mit der Meldung "die SSIS-IDataReader-Objekt liegt hinter dem Ende des Resultset."However, if your code attempts to read data on this final iteration through a loop, when Read still returns true but the last row has been passed, the code will raise an unhandled ApplicationException with the message, "The SSIS IDataReader is past the end of the resultset." Dieses Verhalten unterscheidet sich von dem anderer DataReader-Implementierungen.This behavior is different from that of other DataReader implementations. Daher bei eine Schleife verwenden, um die Zeilen in dem DataReader zu lesen lesen gibt "true", Sie müssen so schreiben Sie Code zum Abfangen, testen und verwerfen diese erwartete ApplicationException auf der letzten erfolgreichen Aufruf der lesen Methode.Therefore, when using a loop to read through the rows in the DataReader while Read returns true, you need to write code to catch, test, and discard this anticipated ApplicationException on the last successful call to the Read method. Oder, wenn Sie die Anzahl der erwarteten Zeilen im Voraus wissen, können Sie die Zeilen verarbeiten, und rufen dann die lesen Methode noch einmal, bevor Sie den DataReader und die Verbindung schließen.Or, if you know in advance the number of rows expected, you can process the rows, and then call the Read method one more time before closing the DataReader and the connection.

  7. Rufen Sie die Dispose Methode der DtsCommand Objekt.Call the Dispose method of the DtsCommand object. Dies ist besonders wichtig, wenn Sie verwendet haben DtsDataParameter Objekte.This is particularly important if you have used any DtsDataParameter objects.

  8. Schließen Sie den DataReader und die Verbindungsobjekte.Close the DataReader and the connection objects.

BeispielExample

Im folgenden Beispiel wird ein Paket ausgeführt, das einen einzelnen Aggregatwert berechnet und den Wert in einem DataReader-Ziel speichert. Dieser Wert wird dann vom DataReader gelesen und in einem Textfeld in einem Windows Form angezeigt.The following example runs a package that calculates a single aggregate value and saves the value to a DataReader destination, and then reads this value from the DataReader and displays the value in a text box on a Windows Form.

Beim Laden der Ausgabe eines Pakets in einer Clientanwendung müssen keine Parameter verwendet werden.The use of parameters is not required when loading the output of a package into a client application. Wenn Sie nicht, um einen Parameter zu verwenden möchten, können Sie die Verwendung der Variablen im weglassen der DtsClient Namespace, und lassen Sie den Code, verwendet der DtsDataParameter Objekt.If you do not want to use a parameter, you can omit the use of the variable in the DtsClient namespace, and omit the code that uses the DtsDataParameter object.

So erstellen Sie das TestpaketTo create the test package

  1. Erstellen Sie ein neues Integration ServicesIntegration Services-Paket.Create a new Integration ServicesIntegration Services package. Im Beispielcode wird "DtsClientWParamPkg.dtsx" als Name des Pakets verwendet.The sample code uses "DtsClientWParamPkg.dtsx" as the name of the package.

  2. Fügen Sie eine Variable der Typzeichenfolge im DtsClient-Namespace hinzu.Add a variable of type String in the DtsClient namespace. Der Beispielscode verwendet "Country" als den Namen der Variablen.The sample code use Country as the name of the variable. (Müssen Sie möglicherweise klicken Sie auf die Variablenspalten Symbolleisten-Schaltfläche in der Variablen Fenster zum Anzeigen der Namespace Spalte.)(You may need to click the Choose Variable Columns toolbar button in the Variables window to display the Namespace column.)

  3. Fügen Sie einen OLE DB-Verbindungs-Manager hinzu, der eine Verbindung zu der AdventureWorks2012AdventureWorks2012-Beispieldatenbank herstellt.Add an OLE DB connection manager that connects to the AdventureWorks2012AdventureWorks2012 sample database.

  4. Fügen Sie dem Paket einen Datenflusstask hinzu, und wechseln Sie zur Datenfluss-Entwurfsoberfläche.Add a data flow task to the package and switch to the Data Flow design surface.

  5. Fügen Sie dem Datenfluss eine OLE DB-Quelle hinzu, und konfigurieren Sie sie so, dass der zuvor erstellte OLE DB-Verbindungs-Manager verwendet werden kann, den Sie vorher erstellt haben. Fügen Sie auch den folgenden SQL-Befehl hinzu:Add an OLE DB source to the data flow and configure it to use the OLE DB connection manager created previously, and the following SQL command:

    SELECT * FROM Sales.vIndividualCustomer WHERE CountryRegionName = ?  
    
  6. Klicken Sie auf Parameter und in der Abfrageparameter festlegen Dialogfeld Feld, das den einzelnen Eingabeparameter in der Abfrage, Parameter0, der Dtsclient-Variablen zuordnen.Click Parameters and, in the Set Query Parameters dialog box, map the single input parameter in the query, Parameter0, to the DtsClient::Country variable.

  7. Fügen Sie dem Datenfluss eine Transformation für das Aggregieren hinzu, und verbinden Sie die Ausgabe der OLE DB-Quelle mit der Transformation.Add an Aggregate transformation to the data flow, and connect the output of the OLE DB source to the transformation. Öffnen Sie den Transformations-Editor für Aggregieren, und konfigurieren Sie diesen so, dass alle Eingabespalten () gezählt werden und der Aggregatwert mit dem Alias "CustomerCount" ausgegeben wird.Open the Aggregate Transformation Editor and configure it to peform a "Count all" operation on all input columns () and to output the aggregated value with the alias CustomerCount.

  8. Fügen Sie dem Datenfluss ein DatenReader-Ziel hinzu, und verbinden Sie die Ausgabe der Transformation für das Aggregieren mit dem DataReader-Ziel.Add a DataReader destination to the data flow and connect the output of the Aggregate transformation to the DataReader destination. Im Beispielcode wird "DataReaderDest" als Name des DataReader verwendet.The sample code uses "DataReaderDest" as the name of the DataReader. Wählen Sie die einzelne verfügbare Eingabespalte, CustomerCount, für das Ziel aus.Select the single available input column, CustomerCount, for the destination.

  9. Speichern Sie das Paket.Save the package. Die anschließend erstellte Testanwendung führt das Paket aus und ruft seine Ausgabe direkt vom Arbeitsspeicher ab.The test application created next will run the package and retrieve its output directly from memory.

So erstellen Sie die TestanwendungTo create the test application

  1. Erstellen Sie eine neue Windows Forms-Anwendung.Create a new Windows Forms application.

  2. Hinzufügen eines Verweises auf die Microsoft.SqlServer.Dts.DtsClient Namespace zu suchen und die Assembly mit dem gleichen Namen in %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.Add a reference to the Microsoft.SqlServer.Dts.DtsClient namespace by browsing to the assembly of the same name in %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.

  3. Kopieren Sie den folgenden Beispielcode, und fügen Sie ihn in das Codemodul für das Formular ein.Copy and paste the following sample code into the code module for the form.

  4. Ändern Sie den Wert, der die DtexecArgs -Variablen so, dass diese enthält die erforderlichen Befehlszeilenparameter dtexec.exe zum Ausführen des Pakets.Modify the value of the dtexecArgs variable as required so that it contains the command-line parameters required by dtexec.exe to run the package. Im Beispielcode wird das Paket aus dem Dateisystem geladen.The sample code loads the package from the file system.

  5. Ändern Sie den Wert, der die DataReaderName -Variablen so, dass diese enthält des Namens des DataReader-Ziels im Paket.Modify the value of the dataReaderName variable as required so that it contains the name of the DataReader destination in the package.

  6. Setzen Sie eine Schaltfläche und ein Textfeld in das Formular.Put a button and a text box on the form. Im Beispielcode wird BtnRun als den Namen der Schaltfläche und TxtResults als den Namen des Textfelds.The sample code uses btnRun as the name of the button, and txtResults as the name of the text box.

  7. Führen Sie die Anwendung aus, und klicken Sie auf die Schaltfläche.Run the application and click the button. Nach einer kurzen Pause während der Ausführung des Pakets sollte der von dem Paket berechnete Aggregatwert (die Anzahl von Kunden in Kanada) im Textfeld auf dem Formular angezeigt werden.After a brief pause while the package runs, you should see the aggregate value calculated by the package (the count of customers in Canada) displayed in the text box on the form.

BeispielcodeSample Code

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;  

    }  
  }  
}  

Siehe auchSee Also

Grundlegendes zu den Unterschieden zwischen lokalen und Remote-Ausführung Understanding the Differences between Local and Remote Execution
Programmgesteuerten laden und Ausführen eines lokalen Pakets Loading and Running a Local Package Programmatically
Programmgesteuertes Laden und Ausführen eines RemotepaketsLoading and Running a Remote Package Programmatically