Udostępnij za pośrednictwem


Ładowanie danych wyjściowych pakietu lokalnego

Dotyczy:sql Server SSIS Integration Runtime w usłudze Azure Data Factory

Aplikacje klienckie mogą odczytywać dane wyjściowe pakietów usług Integration Services, gdy dane wyjściowe są zapisywane w miejscach docelowych programu SQL Server przy użyciu ADO.NET lub gdy dane wyjściowe są zapisywane w lokalizacji docelowej pliku prostego przy użyciu klas w przestrzeni nazw System.IO. Jednak aplikacja kliencka może również odczytywać dane wyjściowe pakietu bezpośrednio z pamięci bez konieczności utrwalania danych przez krok pośredni. Kluczem do tego rozwiązania jest Microsoft.SqlServer.Dts.DtsClient przestrzeni nazw, która zawiera wyspecjalizowane implementacje IDbConnection, IDbCommandi interfejsy IDbDataParameter z przestrzeni nazw System.Data. Zestaw Microsoft.SqlServer.Dts.DtsClient.dll jest instalowany domyślnie w %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.

Ważny

Procedura opisana w tym artykule, która używa biblioteki DtsClient, działa tylko dla pakietów wdrożonych z modelem wdrażania pakietu (czyli z opcją /SQL, /DTSlub /File). Ta procedura nie działa w przypadku pakietów wdrożonych z modelem wdrażania serwera (czyli z opcją /ISServer). Aby użyć danych wyjściowych pakietu lokalnego wdrożonego z modelem wdrażania serwera (czyli z opcją /ISServer), użyj miejsce docelowe przesyłania strumieniowego danych zamiast procedury opisanej w tym artykule.

Nuta

Procedura opisana w tym temacie wymaga, aby właściwość DelayValidation zadania przepływu danych i wszystkich obiektów nadrzędnych została ustawiona na domyślną wartość False.

Opis

Ta procedura przedstawia sposób tworzenia aplikacji klienckiej w kodzie zarządzanym, który ładuje dane wyjściowe pakietu z miejscem docelowym DataReader bezpośrednio z pamięci. Podsumowane kroki przedstawiono w poniższym przykładzie kodu.

Aby załadować dane wyjściowe pakietu danych do aplikacji klienckiej

  1. W pakiecie skonfiguruj miejsce docelowe elementu DataReader, aby odbierało dane wyjściowe, które chcesz odczytać do aplikacji klienckiej. Nadaj lokalizacji docelowej DataReader nazwę opisową, ponieważ ta nazwa będzie używana później w aplikacji klienckiej. Zanotuj nazwę miejsca docelowego elementu DataReader.

  2. W projekcie programistycznym ustaw odwołanie do Microsoft.SqlServer.Dts.DtsClient przestrzeni nazw, lokalizując zestaw Microsoft.SqlServer.Dts.DtsClient.dll. Domyślnie ten zestaw jest instalowany w C:\Program Files\Microsoft SQL Server\100\DTS\Binn. Zaimportuj przestrzeń nazw do kodu przy użyciu C# Using lub instrukcji Import Języka Visual Basic Import.

  3. W kodzie utwórz obiekt typu DtsClient.DtsConnection z parametrami połączenia zawierającymi parametry wiersza polecenia wymagane przez dtexec.exe do uruchomienia pakietu. Aby uzyskać więcej informacji, zobacz dtexec Utility. Następnie otwórz połączenie przy użyciu tych parametrów połączenia. Możesz również użyć narzędzia dtexecui, aby utworzyć wymagane parametry połączenia wizualnie.

    Nuta

    Przykładowy kod demonstruje ładowanie pakietu z systemu plików przy użyciu składni /FILE <path and filename>. Można jednak również załadować pakiet z bazy danych MSDB przy użyciu składni /SQL <package name> lub z magazynu pakietów usług Integration Services przy użyciu składni /DTS \<folder name>\<package name>.

  4. Utwórz obiekt typu DtsClient.DtsCommand, który używa wcześniej utworzonej DtsConnection i ustaw jej właściwość CommandText na nazwę miejsca docelowego DataReader w pakiecie. Następnie wywołaj metodę ExecuteReader obiektu polecenia, aby załadować wyniki pakietu do nowego elementu DataReader.

  5. Opcjonalnie można pośrednio sparametryzować dane wyjściowe pakietu przy użyciu kolekcji obiektów DtsDataParameter w obiekcie DtsCommand, aby przekazać wartości do zmiennych zdefiniowanych w pakiecie. W pakiecie można użyć tych zmiennych jako parametrów zapytania lub w wyrażeniach, aby wpłynąć na wyniki zwrócone do miejsca docelowego elementu DataReader. Należy zdefiniować te zmienne w pakiecie w przestrzeni nazw DtsClient, zanim będzie można ich używać z obiektem DtsDataParameter z aplikacji klienckiej. (Może być konieczne kliknięcie przycisku Wybieranie kolumn zmiennych paska narzędzi w oknie zmiennych , aby wyświetlić kolumnę przestrzeni nazw ). W kodzie klienta po dodaniu DtsDataParameter do kolekcji parametrów kolekcji DtsCommandpomiń odwołanie do przestrzeni nazw DtsClient z nazwy zmiennej. Na przykład:

    command.Parameters.Add(new DtsDataParameter("MyVariable", 1));  
    
  6. Wywołaj metodę Read elementu DataReader wielokrotnie w razie potrzeby, aby przechodzić przez wiersze danych wyjściowych. Użyj danych lub zapisz dane do późniejszego użycia w aplikacji klienckiej.

    Ważny

    Metoda Read tej implementacji elementu DataReader zwraca true jeszcze raz po odczytaniu ostatniego wiersza danych. Utrudnia to użycie zwykłego kodu, który wykonuje pętlę przez element DataReader, podczas gdy read zwraca wartość true. Jeśli kod próbuje zamknąć element DataReader lub połączenie po odczytaniu oczekiwanej liczby wierszy bez dodatkowego, końcowego wywołania metody Read, kod zgłosi nieobsługiwany wyjątek. Jeśli jednak kod próbuje odczytać dane w tej ostatniej iteracji za pośrednictwem pętli, gdy odczyt nadal zwraca true ale ostatni wiersz został przekazany, kod zgłosi nieobsługiwany ApplicationException z komunikatem "SSIS IDataReader jest przeszłością końca zestawu wyników". To zachowanie różni się od innych implementacji elementu DataReader. W związku z tym w przypadku używania pętli do odczytywania wierszy w module DataReader podczas read zwraca wartość true, należy napisać kod do przechwytywania, testowania i odrzucania oczekiwanego ApplicationException przy ostatnim pomyślnym wywołaniu metody Read. Jeśli jednak wiesz wcześniej, ile wierszy oczekuje się, możesz przetworzyć wiersze, a następnie wywołać metodę Read jeszcze raz przed zamknięciem elementu DataReader i połączenia.

  7. Wywołaj metodę Dispose obiektu DtsCommand. Jest to szczególnie ważne, jeśli użyto obiektów DtsDataParameter.

  8. Zamknij element DataReader i obiekty połączenia.

Przykład

Poniższy przykład uruchamia pakiet, który oblicza pojedynczą wartość agregowaną i zapisuje wartość w miejscu docelowym dataReader, a następnie odczytuje tę wartość z elementu DataReader i wyświetla wartość w polu tekstowym w formularzu systemu Windows.

Użycie parametrów nie jest wymagane podczas ładowania danych wyjściowych pakietu do aplikacji klienckiej. Jeśli nie chcesz używać parametru, możesz pominąć użycie zmiennej w DtsClient przestrzeni nazw i pominąć kod używający obiektu DtsDataParameter.

Aby utworzyć pakiet testowy

  1. Utwórz nowy pakiet usług Integration Services. Przykładowy kod używa wartości "DtsClientWParamPkg.dtsx" jako nazwy pakietu.

  2. Dodaj zmienną typu String w przestrzeni nazw DtsClient. Przykładowy kod używa wartości Country jako nazwy zmiennej. (Może być konieczne kliknięcie przycisku Wybieranie kolumn zmiennych paska narzędzi w oknie zmiennych , aby wyświetlić kolumnę przestrzeni nazw ).

  3. Dodaj menedżera połączeń OLE DB, który łączy się z przykładową bazą danych AdventureWorks2022.

  4. Dodaj zadanie przepływu danych do pakietu i przełącz się na powierzchnię projektową Przepływu danych.

  5. Dodaj źródło OLE DB do przepływu danych i skonfiguruj je tak, aby korzystało z utworzonego wcześniej menedżera połączeń OLE DB i następującego polecenia SQL:

    SELECT * FROM Sales.vIndividualCustomer WHERE CountryRegionName = ?  
    
  6. Kliknij Parametry, a następnie w oknie dialogowym Ustaw parametry zapytania zamapuj pojedynczy parametr wejściowy w zapytaniu Parameter0 na zmienną DtsClient::Country.

  7. Dodaj przekształcenie agregacji do przepływu danych i połącz dane wyjściowe źródła OLE DB z transformacją. Otwórz Edytor agregacji przekształceń i skonfiguruj go tak, aby wykonał operację "Zlicz wszystkie" na wszystkich kolumnach wejściowych (*) i wyprowadź zagregowaną wartość z aliasem CustomerCount.

  8. Dodaj miejsce docelowe elementu DataReader do przepływu danych i połącz dane wyjściowe przekształcenia Agregacja z miejscem docelowym dataReader. Przykładowy kod używa wartości "DataReaderDest" jako nazwy elementu DataReader. Wybierz pojedynczą dostępną kolumnę danych wejściowych CustomerCount dla miejsca docelowego.

  9. Zapisz pakiet. Utworzona następnie aplikacja testowa uruchomi pakiet i pobierze dane wyjściowe bezpośrednio z pamięci.

Aby utworzyć aplikację testowa

  1. Utwórz nową aplikację Windows Forms.

  2. Dodaj odwołanie do przestrzeni nazw Microsoft.SqlServer.Dts.DtsClient, przechodząc do zestawu o tej samej nazwie w %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.

  3. Skopiuj i wklej następujący przykładowy kod do modułu kodu dla formularza.

  4. Zmodyfikuj wartość zmiennej dtexecArgs zgodnie z potrzebami, aby zawierała parametry wiersza polecenia wymagane przez dtexec.exe do uruchomienia pakietu. Przykładowy kod ładuje pakiet z systemu plików.

  5. Zmodyfikuj wartość zmiennej dataReaderName zgodnie z potrzebami, aby zawierała nazwę miejsca docelowego DataReader w pakiecie.

  6. Umieść przycisk i pole tekstowe w formularzu. Przykładowy kod używa btnRun jako nazwy przycisku, a txtResults jako nazwę pola tekstowego.

  7. Uruchom aplikację i kliknij przycisk . Po krótkiej przerwie podczas uruchamiania pakietu powinna zostać wyświetlona zagregowana wartość obliczona przez pakiet (liczba klientów w Kanadzie) wyświetlana w polu tekstowym formularza.

Przykładowy kod

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

Zobacz też

zrozumienie różnic między wykonywania lokalnego i zdalnego
programowe ładowanie i uruchamianie pakietu lokalnego
programowe ładowanie i uruchamianie pakietu zdalnego