Ładowanie danych wyjściowych pakiet lokalny
klient aplikacje mogą odczytywać dane wyjściowe Integration Services pakiety po zapisaniu danych wyjściowych SQL Server miejsca docelowe za pomocą ADO.NET, lub gdy dane wyjściowe są zapisywane plik prosty obiekt docelowy przy użyciu klas w System.IO obszar nazw.Jednak aplikacja klient można również przeczytać wyjścia pakiet bezpośrednio z pamięci, bez potrzeby to pośrednich krok utrwalić danych.Klucz do tego rozwiązania jest Microsoft.SqlServer.Dts.DtsClient obszar nazw, który zawiera wyspecjalizowane implementacje IDbConnection, IDbCommand, a IDbDataParameter interfejsy z System.Data obszar nazw.Microsoft.SqlServer.dts.DtsClient.dll jest instalowany domyślnie w zestawie %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.
Uwaga
Procedury opisane w tym temacie wymaga, aby DelayValidation Właściwość zadanie przepływ danych i dowolnego elementu nadrzędnego obiektów zestaw na wartość domyślną Fałszywe.
Description
Procedura ta pokazuje, jak opracowywania aplikacji klienckiej w kod zarządzany, który ładuje dane wyjściowe pakiet z obiekt docelowy elementu obiekt obiekt DataReader bezpośrednio z pamięci.W tym miejscu podsumowania czynności są przedstawiane na przykładowy kod, który następuje.
Aby załadować dane wyjściowe pakiet do aplikacji klient
W pakiecie, należy skonfigurować elementu obiekt obiekt DataReader obiekt docelowy do odbierania danych wyjściowych, którą chcesz wczytać do aplikacji klient.Nadać docelowego elementu obiekt obiekt DataReader opisową nazwę, ponieważ użyje tej nazwy w dalszej części aplikacji klient.Zanotuj nazwę obiekt docelowy elementu obiekt obiekt DataReader.
W przypadku tworzenia projektu, należy ustawić odwołanie Microsoft.SqlServer.Dts.DtsClient obszar nazw poprzez lokalizowanie wirtualny plik dziennika Microsoft.SqlServer.dts.DtsClient.dll.Domyślnie ten wirtualny plik dziennika jest zainstalowany w C:\Program Files\Microsoft SQL Server\100\DTS\Binn.Import the namespace into your code by using the C# Using or the Visual BasicImports statement.
W kodzie Tworzenie obiektu typu DtsClient.DtsConnection w ciąg połączenia, który zawiera parametry wiersza polecenia wymagane przez dtexec.exe należy uruchomić pakiet.Aby uzyskać więcej informacji zobaczNarzędzie dtexec.Następnie otwórz połączenie z tego ciąg połączenia.Można również użyć dtexecui narzędzie, aby utworzyć ciąg połączenia wymagane wizualnie.
Uwaga
Przykładowy kod demonstruje ładowania pakiet z systemu plików przy użyciu /FILE <path and filename> Składnia. Jednak można również ładować pakiet z bazy danych MSDB przy użyciu /SQL <package name> Składnia, lub z Integration Services Magazyn pakiet przy użyciu /DTS \<folder name>\<package name> Składnia.
Tworzenie obiektu typu DtsClient.DtsCommand który korzysta z utworzonego wcześniej DtsConnection i ustaw jego CommandText Właściwość nazwę obiekt docelowy elementu obiekt obiekt DataReader w pakiet. Następnie wywołać ExecuteReader metoda obiektu polecenia, aby załadować pakiet wyniki do nowego elementu obiekt obiekt DataReader.
Opcjonalnie można pośrednio może się parameterize wyjścia pakiet przy użyciu kolekcja DtsDataParameter obiekty na DtsCommand obiekt do przekazania wartości do zmiennych określonych w pakiecie. W pakiecie służy zmienne jak parametry kwerendy lub w wyrażeniach wpływające na wynik zwrócony do obiekt docelowy elementu obiekt obiekt DataReader.Należy zdefiniować zmienne do pakiet w DtsClient obszaru nazw, zanim będzie można z nich korzystać z DtsDataParameter obiekt z aplikacji klient. (Może być konieczne kliknięcie Wybierz kolumna zmiennej przycisk paska narzędzi Zmienne okno wyświetlaniaObszar nazw kolumn.) W kodzie klient, po dodaniu DtsDataParameter Aby Parameters Kolekcja DtsCommand, Pomiń odwołanie obszaru nazw DtsClient z nazwą zmiennej. Na przykład:
command.Parameters.Add(new DtsDataParameter("MyVariable", 1));
Wywołanie Read Metoda elementu obiekt obiekt DataReader wielokrotnie stosownie do potrzeb wiersze danych wyjściowych w pętli. Korzystanie z danych lub zapisać danych w celu późniejszego użycia w aplikacji klient.
Important Note: The Read metoda of this implementation of the obiekt obiekt DataReader returns true one more czas after the last row of data has been read. Dzięki temu bardzo trudne w użyciu w zwykłym kod, który pętli elementu obiekt obiekt DataReader podczas Read Zwraca true. Jeśli próbuje zamknąć elementu obiekt obiekt DataReader lub połączenie po przeczytaniu oczekiwanej liczby wierszy, bez wywołanie dodatkowych, ostateczny, do kodu Read Metoda, kod podnieść nieobsługiwany wyjątek. Niemniej jednak, jeśli kod próbuje odczytywać dane w tym iteracji końcowego za pośrednictwem sieci, gdy Read nadal zwraca true ale ostatni wiersz został przekazany, kod podniesie nieobsługiwany ApplicationExceptionz tą wiadomością "The IDataReader SSIS jest poza koniec resultset". To zachowanie jest inny niż inne implementacje elementu obiekt obiekt DataReader. W związku z tym za pomocą pętli zapoznał się z wierszy w elementu obiekt obiekt DataReader podczas Read Zwraca true, można napisać kod, aby przetestować i odrzucić to przewidywany ApplicationException na ostatnim pomyślne wywołanie Read Metoda. Jeśli znasz z góry liczbę wierszy, oczekiwano, można przetwarzać wierszy, a następnie wywołać Read Metoda jeden więcej czas przed zamknięciem elementu obiekt obiekt DataReader i połączenia.
Wywołanie Dispose Metoda DtsCommand obiekt. Jest to szczególnie ważne w przypadku wykorzystania dowolnego DtsDataParameter obiekty.
Zamknij elementu obiekt obiekt DataReader i obiekty połączenia.
Przykład
W poniższym przykładzie uruchamia pakiet, który oblicza pojedynczej wartości agregacja i zapisuje wartość elementu obiekt obiekt DataReader obiekt docelowy i następnie odczytuje tę wartość z elementu obiekt obiekt DataReader i wyświetla wartość w polu tekstowym na formularzu systemu Windows.
Korzystanie z parametrów nie jest wymagane podczas ładowania danych wyjściowych pakiet do aplikacji klient.Jeśli nie chcesz używać parametru, można pominąć użycie zmiennej w DtsClient obszaru nazw i pominąć kod, który używa DtsDataParameter obiekt.
Aby utworzyć pakiet testu
Tworzenie nowej Integration Services pakiet. Kod przykładowy używa "DtsClientWParamPkg.dtsx" jako nazwę pakiet.
W obszarze nazw DtsClient, należy dodać zmienną typu ciąg.Przykładowy kod używać krajów jako nazwę zmiennej.(Może być konieczne kliknięcie Wybierz kolumna zmiennej przycisk paska narzędzi Zmienne okno wyświetlaniaObszar nazw kolumn.)
Dodawanie menedżer połączeń OLE DB, który łączy z AdventureWorks Przykładowa baza danych.
Dodawanie zadania przepływ danych do pakiet i Przełącz się do powierzchni projektu przepływ danych.
Dodaj urządzenie źródłowe danych OLE DB dla przepływ danych i skonfigurować go do używania menedżer połączeń OLE DB utworzone wcześniej i następującego polecenia SQL:
SELECT * FROM Sales.vIndividualCustomer WHERE CountryRegionName = ?
Kliknij przycisk Parametry a Ustawianie parametrów kwerendy w oknie dialogowym należy mapować jeden parametr wejściowy, w kwerendzie Parameter0, zmienna DtsClient::Country.
Dodaj transformacja agregacja dla przepływ danych, a następnie połączyć transformacja danych wyjściowych źródeł OLE DB.Otwórz Edytor transformacja agregacja i skonfigurować go do operacji "Liczba wszystkich" na wszystkich kolumn danych wejściowych ** peform i dane wyjściowe zagregowane wartości z alias CustomerCount.
Dodawanie obiekt docelowy elementu obiekt obiekt DataReader do przepływ danych i połączyć się z danych wyjściowych transformacja agregacja docelowego elementu obiekt obiekt DataReader.Przykładowy kod "DataReaderDest" jest używana jako nazwa elementu obiekt obiekt DataReader.Wybierz pojedynczy dostępne wejściowy kolumna, CustomerCount, obiekt docelowy.
Zapisać pakiet.Test aplikacja utworzony następny będzie należy uruchomić pakiet i pobierają dane wyjściowe bezpośrednio z pamięci.
Aby utworzyć aplikację testu
Utwórz nową aplikację Windows Forms.
Dodaj odwołanie do Microsoft.SqlServer.Dts.DtsClient obszar nazw, przechodząc do wirtualny plik dziennika o takiej samej nazwie w %ProgramFiles%\Microsoft Server\100\DTS\Binn SQL.
Skopiuj i wklej następujący przykładowy kod do modułu kodu dla formularza.
Zmodyfikuj wartość dtexecArgs zmienną jako wymagane tak, że zawiera parametry wiersza polecenia wymagane przez dtexec.exe należy uruchomić pakiet.Przykładowy kod powoduje załadowanie pakiet z systemu plików.
Zmodyfikuj wartość dataReaderName zmienną jako wymagana tak, aby zawierał nazwę obiekt docelowy elementu obiekt obiekt DataReader w pakiecie.
Umieść przycisk i pole tekstowe na formularzu.Kod przykładowy używa btnRun jako nazwa przycisku i txtResults jako nazwę pola tekstowego.
Uruchom aplikację, a następnie kliknij przycisk.Po wstrzymaniu krótkie podczas uruchomienia pakiet należy skontaktować się z wartości agregacja, obliczona przy użyciu pakiet (liczba klientów w Kanadzie) wyświetlana w polu tekstowym w formularzu.
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;
}
}
}
|