Ł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
, /DTS
lub /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
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.
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 BasicImport. 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>
.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.
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ówkolekcji DtsCommand pomiń odwołanie do przestrzeni nazw DtsClient z nazwy zmiennej. Na przykład:command.Parameters.Add(new DtsDataParameter("MyVariable", 1));
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.
Wywołaj metodę Dispose obiektu DtsCommand. Jest to szczególnie ważne, jeśli użyto obiektów DtsDataParameter.
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
Utwórz nowy pakiet usług Integration Services. Przykładowy kod używa wartości "DtsClientWParamPkg.dtsx" jako nazwy pakietu.
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 ). Dodaj menedżera połączeń OLE DB, który łączy się z przykładową bazą danych AdventureWorks2022.
Dodaj zadanie przepływu danych do pakietu i przełącz się na powierzchnię projektową Przepływu danych.
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 = ?
Kliknij Parametry, a następnie w oknie dialogowym Ustaw parametry zapytania zamapuj pojedynczy parametr wejściowy w zapytaniu Parameter0 na zmienną DtsClient::Country.
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.
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.
Zapisz pakiet. Utworzona następnie aplikacja testowa uruchomi pakiet i pobierze dane wyjściowe bezpośrednio z pamięci.
Aby utworzyć aplikację testowa
Utwórz nową aplikację Windows Forms.
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.
Skopiuj i wklej następujący przykładowy kod do modułu kodu dla formularza.
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.
Zmodyfikuj wartość zmiennej dataReaderName zgodnie z potrzebami, aby zawierała nazwę miejsca docelowego DataReader w pakiecie.
Umieść przycisk i pole tekstowe w formularzu. Przykładowy kod używa btnRun jako nazwy przycisku, a txtResults jako nazwę pola tekstowego.
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