Sdílet prostřednictvím


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 obor názvů Microsoft.SqlServer.DtsClient, který obsahuje specializované implementaceIDbConnection , IDbCommanda rozhraní IDbDataParameter z oboru názvů System.Data. Ve výchozím nastavení je Microsoft.SqlServer.Dts.DtsClient.dll sestavení nainstalováno v %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.

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, /DTSnebo /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

  1. 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.

  2. 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.

  3. 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>.

  4. 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.

  5. 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));  
    
  6. 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í.

  7. Volání Dispose metoda DtsCommand objektu. To je zvlášť důležité, pokud jste použili jakékoli DtsDataParameter objekty.

  8. 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

  1. Vytvořte nový balíček integrační služby. Vzorový kód používá jako název balíčku "DtsClientWParamPkg.dtsx".

  2. 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ů .)

  3. Přidejte správce připojení OLE DB, který se připojuje k ukázkové databázi AdventureWorks2022.

  4. Přidejte do balíčku úlohu toku dat a přepněte na návrhovou plochu toku dat.

  5. 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 = ?  
    
  6. Klikněte na Parametry a v dialogovém okně Nastavit parametry dotazu namapujte jeden vstupní parametr dotazu, Parametr0 na proměnnou DtsClient::Country.

  7. 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.

  8. 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.

  9. 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

  1. Vytvořte novou aplikaci Windows Forms.

  2. 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.

  3. Zkopírujte následující ukázkový kód a vložte ho do modulu kódu formuláře.

  4. 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ů.

  5. Upravte hodnotu dataReaderName proměnnou podle potřeby tak, aby obsahovala název cíle DataReader v balíčku.

  6. 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.

  7. 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