Načtení výstupu místního balíčku
platí pro:SQL Server SSIS Integration Runtime ve službě Azure Data Factory
Klientské aplikace mohou číst výstup balíčků integračních služeb při uložení výstupu do cílů SQL Serveru pomocí ADO.NET nebo při uložení výstupu do cílového plochého souboru pomocí tříd v oboru názvů System.IO. Klientská aplikace ale může také číst výstup balíčku přímo z paměti, aniž by bylo nutné, aby se data zachovala zprostředkujícím krokem. Klíčem k tomuto řešení je
Důležitý
Postup popsaný v tomto článku, který používá knihovnu DtsClient
, funguje pouze pro balíčky nasazené s modelem nasazení balíčku (to znamená s možností /SQL
, /DTS
nebo /File
). Tento postup nefunguje u balíčků nasazených s modelem nasazení serveru (to znamená s možností /ISServer
). Pokud chcete využívat výstup místního balíčku nasazeného s modelem nasazení serveru (to znamená s možností /ISServer
), použijte místo postupu popsaného v tomto článku cíl streamování dat.
Poznámka
Postup popsaný v tomto tématu vyžaduje, aby vlastnost DelayValidation úlohy Toku dat a všech nadřazených objektů byla nastavena na výchozí hodnotu False.
Popis
Tento postup ukazuje, jak vyvíjet klientskou aplikaci ve spravovaném kódu, která načte výstup balíčku s cílem DataReader přímo z paměti. Níže uvedené kroky jsou znázorněny v ukázce kódu, která následuje.
Načtení výstupu datového balíčku do klientské aplikace
V balíčku nakonfigurujte cíl DataReader tak, aby přijímal výstup, který chcete číst do klientské aplikace. Dejte cílovému objektu DataReader popisný název, protože tento název použijete později v klientské aplikaci. Poznamenejte si název cíle DataReader.
V projektu vývoje nastavte odkaz na Microsoft.SqlServer.Dts.DtsClient oboru názvů vyhledáním Microsoft.SqlServer.Dts.DtsClient.dllsestavení . Ve výchozím nastavení je toto sestavení nainstalováno v C:\Program Files\Microsoft SQL Server\100\DTS\Binn. Naimportujte obor názvů do kódu pomocí jazyka C# pomocí nebo příkazu Import jazyka Visual Basic.
V kódu vytvořte objekt typu DtsClient.DtsConnection s připojovacím řetězcem, který obsahuje parametry příkazového řádku vyžadované dtexec.exe ke spuštění balíčku. Další informace naleznete v tématu dtexec Utility. Pak otevřete připojení s tímto připojovacím řetězcem. K vizuálnímu vytvoření požadovaného připojovacího řetězce můžete také použít nástroj dtexecui.
Poznámka
Ukázkový kód ukazuje načtení balíčku ze systému souborů pomocí syntaxe
/FILE <path and filename>
. Balíček můžete také načíst z databáze MSDB pomocí syntaxe/SQL <package name>
nebo z úložiště balíčků integračních služeb pomocí syntaxe/DTS \<folder name>\<package name>
.Vytvořte objekt typu DtsClient.DtsCommand, který používá dříve vytvořenou DtsConnection a jeho CommandText vlastnost na název cíle DataReader v balíčku. Potom zavolejte ExecuteReader metoda příkazového objektu načtení výsledků balíčku do nové DataReader.
Volitelně můžete nepřímo parametrizovat výstup balíčku pomocí kolekce DtsDataParameter objekty v DtsCommand objektu, který předává hodnoty proměnným definovaným v balíčku. V rámci balíčku můžete tyto proměnné použít jako parametry dotazu nebo ve výrazech k ovlivnění výsledků vrácených do cíle DataReader. Tyto proměnné musíte definovat v balíčku v DtsClient oboru názvů, abyste je mohli použít s objektem DtsDataParameter z klientské aplikace. (Možná budete muset kliknout na tlačítko
Zvolit sloupce proměnných panelu nástrojů v okněProměnné , aby se zobrazil sloupec oboru názvů.) Když v kódu klienta přidáte DtsDataParameter do kolekce parametrůkolekce DtsCommand , vynecháte odkaz na obor názvů DtsClient z názvu proměnné. Například:command.Parameters.Add(new DtsDataParameter("MyVariable", 1));
Volání Read metodu DataReader opakovaně podle potřeby procházet řádky výstupních dat. Použijte data nebo je uložte pro pozdější použití v klientské aplikaci.
Důležitý
Metoda Read této implementace třídy DataReader vrátí true jednou po přečtení posledního řádku dat. To znesnadňuje použití obvyklého kódu, který prochází DataReader, zatímco Read vrací true. Pokud se váš kód pokusí zavřít DataReader nebo připojení po přečtení očekávaného počtu řádků bez dalšího konečného volání Read metoda, kód vyvolá neošetřenou výjimku. Pokud se však váš kód pokusí přečíst data v této konečné iteraci prostřednictvím smyčky, když Read stále vrací true, ale poslední řádek byl předán, kód vyvolá neošetřenou ApplicationException se zprávou "SSIS IDataReader je za koncem sady výsledků." Toto chování se liší od jiné implementace DataReader. Proto při použití smyčky číst řádky v DataReader zatímco Read vrací true, musíte napsat kód pro zachycení, testování a zahodit tento očekávaný ApplicationException při posledním úspěšném volání metody Read. Nebo pokud znáte předem očekávaný počet řádků, můžete řádky zpracovat a potom volat Read metodu ještě jednou před zavřením třídy DataReader a připojení.
Volání Dispose metoda DtsCommand objektu. To je zvlášť důležité, pokud jste použili jakékoli DtsDataParameter objekty.
Zavřete DataReader a objekty připojení.
Příklad
Následující příklad spustí balíček, který vypočítá jednu agregační hodnotu a uloží hodnotu do cíle DataReader a pak přečte tuto hodnotu z Objektu DataReader a zobrazí hodnotu v textovém poli ve formuláři Windows Form.
Při načítání výstupu balíčku do klientské aplikace není vyžadováno použití parametrů. Pokud nechcete použít parametr, můžete vynechat použití proměnné v oboru názvů DtsClient a vynechat kód, který používá DtsDataParameter objektu.
Vytvoření testovacího balíčku
Vytvořte nový balíček integrační služby. Vzorový kód používá jako název balíčku "DtsClientWParamPkg.dtsx".
Přidejte proměnnou typu String v oboru názvů DtsClient. Vzorový kód používá jako název proměnné zemi. (Možná budete muset kliknout na tlačítko
Zvolit sloupce proměnných panelu nástrojů v okněProměnné , aby se zobrazil sloupec oboru názvů.) Přidejte správce připojení OLE DB, který se připojuje k ukázkové databázi AdventureWorks2022.
Přidejte do balíčku úlohu toku dat a přepněte na návrhovou plochu toku dat.
Přidejte do toku dat zdroj OLE DB a nakonfigurujte ho tak, aby používal dříve vytvořený správce připojení OLE DB a následující příkaz SQL:
SELECT * FROM Sales.vIndividualCustomer WHERE CountryRegionName = ?
Klikněte na Parametry a v dialogovém okně Nastavit parametry dotazu namapujte jeden vstupní parametr dotazu, Parametr0 na proměnnou DtsClient::Country.
Přidejte do toku dat agregovanou transformaci a připojte výstup zdroje OLE DB k transformaci. Otevřete Editor agregačních transformací a nakonfigurujte ji tak, aby prováděla operaci Count all (Count all) ve všech vstupních sloupcích (*) a vypíše agregovanou hodnotu pomocí aliasu CustomerCount.
Přidejte do toku dat cíl DataReader a připojte výstup agregační transformace k cíli DataReader. Vzorový kód používá "DataReaderDest" jako název DataReader. Vyberte jeden dostupný vstupní sloupec CustomerCount pro cíl.
Uložte balíček. Testovací aplikace vytvořená dále spustí balíček a načte výstup přímo z paměti.
Vytvoření testovací aplikace
Vytvořte novou aplikaci Windows Forms.
Přidejte odkaz na obor názvů Microsoft.SqlServer.Dts.DtsClient tak, že přejdete na sestavení stejného názvu v %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.
Zkopírujte následující ukázkový kód a vložte ho do modulu kódu formuláře.
Upravte hodnotu proměnné dtexecArgs podle potřeby tak, aby obsahovala parametry příkazového řádku vyžadované dtexec.exe ke spuštění balíčku. Ukázkový kód načte balíček ze systému souborů.
Upravte hodnotu dataReaderName proměnnou podle potřeby tak, aby obsahovala název cíle DataReader v balíčku.
Vložte tlačítko a textové pole do formuláře. Vzorový kód používá btnRun jako název tlačítka a txtResults jako název textového pole.
Spusťte aplikaci a klikněte na tlačítko. Po krátkém pozastavení při spuštění balíčku byste měli vidět agregovanou hodnotu vypočítanou balíčkem (počet zákazníků v Kanadě) zobrazenou v textovém poli ve formuláři.
Ukázkový kód
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;
}
}
}
Viz také
pochopení rozdílů mezi místním a vzdáleným spouštěním
načítání a spouštění místního balíčku prostřednictvím kódu programu
načítání a spouštění vzdáleného balíčku prostřednictvím kódu programu