Ładowanie pakietu do innego programu
Aplikacje klienckie mogą odczytywać dane wyjściowe Integration Services pakietów przy użyciu jednej z następujących opcji:
ADO.NETzapisania danych wyjściowych do SQL Server miejsc docelowych.
Klasy w System.IO nazw podczas zapisywania danych wyjściowych do plik prosty miejsca docelowego.
Jednak aplikacja klient można również przeczytać wyjścia pakiet bezpośrednio z pamięci bez konieczności kroku pośredniego, który pozostawałby danych.
Klucz do tego rozwiązania jest Microsoft.SqlServer.Dts.DtsClient obszaru nazw, który zawiera wyspecjalizowane implementacje IDbConnection, IDbCommand, i IDbDataParameter interfejsy z dane systemowe obszaru nazw.Można znaleźć tego obszaru nazw w wirtualny plik dziennika, Microsoft.SqlServer.Dts.DtsClient.dll, który jest instalowany domyślnie w %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn folder.
Ostrzeżenie
Procedury opisane w tym temacie wymaga DelayValidation na wartość domyślną zestaw właściwość zadania przepływu danych i obiekty nadrzędne False.
Sekcje w tym temacie
|
Jak załadować dane wyjściowe pakiet bezpośrednio z pamięci
Tej procedury przedstawiono sposób użycia kod zarządzany do opracowywania aplikacji klienckiej, która ładuje bezpośrednio z pamięci danych wyjściowych pakiet, który zawiera element DataReader obiekt docelowy.W sekcji poniżej tej procedury jest przykładowy kod, który demonstruje podsumowane kroki procedury.
Załadować dane wyjściowe pakiet z pamięci do aplikacji klient
Przepływ danych pakiet skonfigurować elementu DataReader obiekt docelowy odbierać dane wyjściowe do odczytu do aplikacji klient.Nadaj elementu DataReader obiekt docelowy nazwę opisową, ponieważ później w aplikacji klient będzie używać tej nazwy.Zanotuj nazwę obiekt docelowy elementu DataReader.
W projekcie rozwoju zestaw odwołanie do Microsoft.SqlServer.Dts.DtsClient obszaru nazw, lokalizując zgromadzenie 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 Basic Imports statement.
W kodzie, tworzenie obiektu typu DtsClient.DtsConnection z połączeniem ciąg zawierającego parametry wiersza polecenia wymagane przez dtexec.exe , aby uruchomić pakiet.Aby uzyskać więcej informacji, zobacz dtexec narzędzia (narzędzie SSIS).Można również użyć dtexecui narzędzie do tworzenia połączenia wymagane ciąg wizualnie.
Ostrzeżenie
Przykładowy kod znajdujący się w tej procedurze ładujący pakiet z systemu plików za pomocą /FILE <path and filename> składni.Jednakże można również ładować pakietu z msdb bazy danych za pomocą /SQL <package name> składni, lub z Integration Services magazynu pakiet przy użyciu /DTS \<folder name>\<package name> składni.
Otwórz połączenie z tym połączeniem ciąg.
Tworzenie obiektu typu DtsClient.DtsCommand używający utworzone wcześniej DtsConnection jako połączenie.Ustaw polecenie CommandText właściwość Nazwa docelowego elementu DataReader w pakiet.Następnie wywołać ExecuteReader metoda obiektu polecenia załadować pakiet wyniki do nowego elementu DataReader.
Opcjonalnie pośrednio można parameterize danych wyjściowych pakiet przy użyciu kolekcja DtsDataParameter obiektów na DtsCommand obiektu do przekazania wartości do zmiennych zdefiniowanych w pakiecie.W pakiet, można użyć tych zmiennych, jak parametry kwerendy lub w wyrażeniach wpłynąć na wyniki zwrócone do docelowego elementu DataReader.Należy zdefiniować zmienne w pakiet w DtsClient nazw przed użyciem ich z DtsDataParameter obiekt z aplikacji klient.(Należy kliknąć przycisk Wybierz kolumna zmiennej przycisk paska narzędzi w zmiennych okna, aby wyświetlić nazw kolumna.) Kod klient, po dodaniu DtsDataParameter do Parameters kolekcja DtsCommand, pominąć odwołanie obszaru nazw DtsClient z nazwy zmiennej.Na przykład:
command.Parameters.Add(new DtsDataParameter("MyVariable", 1));
Wywołanie Read wyjściowy metoda elementu DataReader wielokrotnie odpowiednio pętli wierszy danych.Użyj danych lub zapisać danych do późniejszego wykorzystania w klient aplikacji.
Ważne: Read Metoda ta implementacja elementu DataReader zwraca true jedną czas po ostatnim wierszu danych odczytu.Utrudnia zwykły kod, który pętli elementu DataReader podczas Read zwraca true.Jeśli kod próbuje zamknąć elementu DataReader lub połączenia po przeczytaniu oczekiwana liczba wierszy bez dodatkowych, końcowe wywołania do Read metoda podniesie kod nieobsługiwany wyjątek.Jednakże, jeśli kod próbuje odczytać danych z tego ostatecznego iteracji pętli, za pośrednictwem po Read nadal zwraca true , ale ostatni wiersz został przekazany, kod podniesie nieobsługiwany ApplicationException z wiadomością, "SSIS IDataReader jest koniec resultset." To zachowanie różni się od innych implementacjach elementu DataReader.Dlatego za pomocą pętli zapoznał się z wierszy w elementu DataReader podczas Read zwraca true, należy napisać kod do połowu, przetestować i Odrzuć to przewidywanych ApplicationException na ostatnie pomyślne wywołanie Read metoda.Znając wyprzedzeniem liczbę wierszy, oczekiwano, można przetwarzać wiersze, a następnie wywołać Read jedną metodę czas przed zamknięciem elementu DataReader i połączenie.
Wywołanie Dispose metoda DtsCommand obiektu.Jest to szczególnie ważne, jeśli użyto żadnego DtsDataParameter obiektów.
Zamknij elementu DataReader i obiekty połączenia.
Przykład
Poniższy przykład uruchamia pakiet, który oblicza wartość wartość zagregowana i zapisuje wartość elementu DataReader obiekt docelowy, a następnie odczytuje wartości z elementu DataReader i wyświetla wartość w pole tekstowe na formularzu systemu Windows.
Użycie 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 obszar nazw i pominąć kod, który używa DtsDataParameter obiektu.
Aby utworzyć pakiet badania
Utwórz nowy 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 kraju należy użyć jako nazwy zmiennej.(Należy kliknąć przycisk Wybierz kolumna zmiennej przycisk paska narzędzi w zmiennych okna, aby wyświetlić nazw kolumna.)
Dodawanie menedżer połączeń OLE DB, który łączy się z AdventureWorks2008R2 przykładowej bazy danych.
Dodaj zadanie przepływ danych pakiet i Przełącz do powierzchni projektu przepływ danych.
Dodaj źródło 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 Parametry i w Ustawić parametry kwerendy okno dialogowe opcję Mapowanie jeden parametr wejściowy w kwerendzie Parameter0, do zmiennej DtsClient::Country.
Dodać agregacji transformacja do przepływ danych i Połącz wyjście OLE DB źródło do transformacja.Otwórz Edytor transformacji agregacji i skonfigurować go do administracją "policzyć wszystkie" Operacja wprowadzania wszystkich kolumn (*) i wyjściowy zagregowaną wartość z alias CustomerCount.
Dodawanie obiekt docelowy elementu DataReader przepływ danych i Połącz wyjście agregacji transformacja docelowego elementu DataReader.Kod przykładowy używa "datareaderdest" Nazwa elementu DataReader.Zaznacz pojedynczą wprowadzania kolumna dostępne, CustomerCount, obiekt docelowy.
Zapisać pakiet.Aplikację testową utworzone dalej będzie uruchomić pakiet i pobierają dane wyjściowe bezpośrednio z pamięci.
Aby utworzyć aplikację testową
Tworzenie nowej aplikacji Windows Forms.
Dodaj odwołanie do Microsoft.SqlServer.Dts.DtsClient obszaru nazw, przechodząc do wirtualny plik dziennika tej samej nazwie w %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.
Skopiuj i wklej następujący kod do modułu kodu dla formularza.
Modyfikowanie wartości dtexecArgs zmiennej wymagane tak że zawiera parametry wiersza polecenia wymagane przez dtexec.exe , aby uruchomić pakiet.Przykładowy kod ładuje pakiet z systemu plików.
Modyfikowanie wartości dataReaderName zmiennej wymagane tak że zawiera nazwę docelowego elementu DataReader w pakiet.
Umieścić przycisk i pole tekstowe na formularzu.Kod przykładowy używa btnRun jako nazwę przycisku, a txtResults jako nazwę pola tekstowego.
Uruchom aplikację, a następnie kliknij przycisk.Po wstrzymaniu krótkie podczas wykonywania pakietu, należy skontaktować się z wartość zagregowana wartości obliczone 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;
}
}
}
|