De uitvoer van een lokaal pakket laden
van toepassing op:SQL Server SSIS Integration Runtime in Azure Data Factory
Clienttoepassingen kunnen de uitvoer van Integration Services-pakketten lezen wanneer de uitvoer wordt opgeslagen op SQL Server-bestemmingen met behulp van ADO.NET of wanneer de uitvoer wordt opgeslagen op een plat bestandsdoel met behulp van de klassen in de System.IO naamruimte. Een clienttoepassing kan echter ook de uitvoer van een pakket rechtstreeks vanuit het geheugen lezen, zonder dat er een tussenstap nodig is om de gegevens te behouden. De sleutel voor deze oplossing is de Microsoft.SqlServer.Dts.DtsClient naamruimte, die gespecialiseerde implementaties bevat van de IDbConnection-, IDbCommand-en IDbDataParameter interfaces uit de System.Data naamruimte. De assembly-Microsoft.SqlServer.Dts.DtsClient.dll is standaard geïnstalleerd in %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.
Belangrijk
De procedure die in dit artikel wordt beschreven, die gebruikmaakt van de DtsClient
-bibliotheek, werkt alleen voor pakketten die zijn geïmplementeerd met het pakketimplementatiemodel (dat wil gezegd, met de optie /SQL
, /DTS
of /File
). Deze procedure werkt niet voor pakketten die zijn geïmplementeerd met het serverimplementatiemodel (dat wil gezegd, met de optie /ISServer
). Als u de uitvoer van een lokaal pakket wilt gebruiken dat is geïmplementeerd met het serverimplementatiemodel (met de optie /ISServer
), gebruikt u de Doel voor gegevensstreaming in plaats van de procedure die in dit artikel wordt beschreven.
Notitie
Voor de procedure die in dit onderwerp wordt beschreven, moet de eigenschap DelayValidation van de gegevensstroomtaak en van eventuele bovenliggende objecten worden ingesteld op de standaardwaarde van False.
Beschrijving
Deze procedure laat zien hoe u een clienttoepassing ontwikkelt in beheerde code waarmee de uitvoer van een pakket met een DataReader-bestemming rechtstreeks vanuit het geheugen wordt geladen. De stappen die hier worden samengevat, worden gedemonstreerd in het volgende codevoorbeeld.
Uitvoer van gegevenspakketten laden in een clienttoepassing
Configureer in het pakket een DataReader-bestemming om de uitvoer te ontvangen die u wilt lezen in de clienttoepassing. Geef de DataReader-bestemming een beschrijvende naam, omdat u deze naam later in uw clienttoepassing gaat gebruiken. Noteer de naam van de DataReader-bestemming.
Stel in het ontwikkelingsproject een verwijzing in naar de Microsoft.SqlServer.Dts.DtsClient naamruimte door de assembly Microsoft.SqlServer.Dts.DtsClient.dllte zoeken. Deze assembly is standaard geïnstalleerd in C:\Program Files\Microsoft SQL Server\100\DTS\Binn. Importeer de naamruimte in uw code met behulp van de instructie C# Using of the Visual Basic Imports instructie.
Maak in uw code een object van het type DtsClient.DtsConnection met een verbindingsreeks die de opdrachtregelparameters bevat die vereist zijn voor dtexec.exe om het pakket uit te voeren. Zie dtexec Utilityvoor meer informatie. Open vervolgens de verbinding met deze verbindingsreeks. U kunt ook het hulpprogramma dtexecui gebruiken om de vereiste verbindingsreeks visueel te maken.
Notitie
De voorbeeldcode laat zien hoe u het pakket vanuit het bestandssysteem laadt met behulp van de
/FILE <path and filename>
syntaxis. U kunt het pakket echter ook laden vanuit de MSDB-database met behulp van de/SQL <package name>
syntaxis of vanuit het Integration Services-pakketarchief met behulp van de/DTS \<folder name>\<package name>
syntaxis.Maak een object van het type DtsClient.DtsCommand- dat gebruikmaakt van de eerder gemaakte DtsConnection- en stel de eigenschap CommandText in op de naam van de DataReader-bestemming in het pakket. Roep vervolgens de ExecuteReader methode van het opdrachtobject aan om de pakketresultaten in een nieuwe DataReader te laden.
U kunt de uitvoer van het pakket indirect parameteriseren met behulp van de verzameling DtsDataParameter--objecten op het DtsCommand--object om waarden door te geven aan variabelen die in het pakket zijn gedefinieerd. In het pakket kunt u deze variabelen gebruiken als queryparameters of in expressies om de resultaten te beïnvloeden die worden geretourneerd naar de DataReader-bestemming. U moet deze variabelen definiëren in het pakket in de DtsClient-naamruimte voordat u deze kunt gebruiken met het DtsDataParameter--object vanuit een clienttoepassing. (Mogelijk moet u in het venster
Variabelen op de knop Variabele kolommenkiezen om de naamruimte kolom weer te geven.) Wanneer u in de clientcode eenDtsDataParameter- toevoegt aan de verzamelingParameters van deDtsCommand- , laat u de dtsClient-naamruimtereferentie weg uit de naam van de variabele. Bijvoorbeeld:command.Parameters.Add(new DtsDataParameter("MyVariable", 1));
Roep de methode Read van de DataReader herhaaldelijk aan als dat nodig is om de rijen met uitvoergegevens te doorlopen. Gebruik de gegevens of sla de gegevens op voor later gebruik in de clienttoepassing.
Belangrijk
De methode Read van deze implementatie van DataReader retourneert echte nog één keer nadat de laatste rij met gegevens is gelezen. Dit maakt het moeilijk om de gebruikelijke code te gebruiken die door de DataReader loopt terwijl Lezenechteretourneert. Als uw code probeert de DataReader of de verbinding te sluiten nadat het verwachte aantal rijen is gelezen, zonder een extra aanroep van de methode Read, wordt er een onverwerkte uitzondering gegenereerd. Als uw code echter probeert gegevens te lezen over deze laatste iteratie via een lus, wordt er bij Read nog steeds true geretourneerd, maar de laatste rij is doorgegeven, wordt met de code een niet-verwerkte ApplicationException- met het bericht 'De SSIS IDataReader ligt voorbij het einde van de resultatenset'. Dit gedrag verschilt van die van andere DataReader-implementaties. Als u daarom een lus gebruikt om de rijen in de DataReader te lezen terwijl Lezenwaarretourneert, moet u code schrijven om deze verwachte ApplicationException- te vangen, testen en negeren tijdens de laatste geslaagde aanroep van de methode Read. Als u van tevoren het verwachte aantal rijen weet, kunt u de rijen verwerken en vervolgens de methode Read aanroepen voordat u de DataReader en de verbinding sluit.
Roep de methode Dispose van het DtsCommand--object aan. Dit is met name belangrijk als u DtsDataParameter objecten hebt gebruikt.
Sluit de DataReader en de verbindingsobjecten.
Voorbeeld
In het volgende voorbeeld wordt een pakket uitgevoerd waarmee één geaggregeerde waarde wordt berekend en de waarde wordt opgeslagen op een DataReader-bestemming. Vervolgens wordt deze waarde uit DataReader gelezen en wordt de waarde weergegeven in een tekstvak op een Windows-formulier.
Het gebruik van parameters is niet vereist bij het laden van de uitvoer van een pakket in een clienttoepassing. Als u geen parameter wilt gebruiken, kunt u het gebruik van de variabele weglaten in de DtsClient naamruimte en de code weglaten die gebruikmaakt van het DtsDataParameter--object.
Het testpakket maken
Maak een nieuw Integration Services-pakket. De voorbeeldcode maakt gebruik van DtsClientWParamPkg.dtsx als de naam van het pakket.
Voeg een variabele van het type String toe in de DtsClient-naamruimte. De voorbeeldcode gebruikt Land als de naam van de variabele. (Mogelijk moet u in het venster
Variabelen op de knop Variabele kolommenkiezen om de naamruimte kolom weer te geven.)Voeg een OLE DB-verbindingsbeheerder toe die verbinding maakt met de voorbeelddatabase AdventureWorks2022.
Voeg een gegevensstroomtaak toe aan het pakket en schakel over naar het ontwerpoppervlak voor gegevensstromen.
Voeg een OLE DB-bron toe aan de gegevensstroom en configureer deze om het OLE DB-verbindingsbeheer te gebruiken dat u eerder hebt gemaakt en de volgende SQL-opdracht:
SELECT * FROM Sales.vIndividualCustomer WHERE CountryRegionName = ?
Klik op Parameters en wijs in het dialoogvenster Queryparameters instellen de enkele invoerparameter in de query Parameter0 toe aan de variabele DtsClient::Country.
Voeg een statistische transformatie toe aan de gegevensstroom en koppel de uitvoer van de OLE DB-bron aan de transformatie. Open de editor voor samenvoegingstransformatie en configureer deze om een bewerking 'Alle tellen' uit te voeren op alle invoerkolommen (*) en om de geaggregeerde waarde uit te voeren met de alias CustomerCount.
Voeg een DataReader-bestemming toe aan de gegevensstroom en verbind de uitvoer van de statistische transformatie met de DataReader-bestemming. In de voorbeeldcode wordt 'DataReaderDest' gebruikt als de naam van de DataReader. Selecteer de enkele beschikbare invoerkolom, CustomerCount, voor de bestemming.
Sla het pakket op. De testtoepassing die vervolgens wordt gemaakt, voert het pakket uit en haalt de uitvoer rechtstreeks op uit het geheugen.
De testtoepassing maken
Maak een nieuwe Windows Forms-toepassing.
Voeg een verwijzing toe naar de Microsoft.SqlServer.Dts.DtsClient naamruimte door te bladeren naar de assembly van dezelfde naam in %ProgramFiles%\Microsoft SQL Server\100\DTS\Binn.
Kopieer en plak de volgende voorbeeldcode in de codemodule voor het formulier.
Wijzig de waarde van de dtexecArgs variabele zoals vereist, zodat deze de opdrachtregelparameters bevat die zijn vereist voor dtexec.exe om het pakket uit te voeren. Met de voorbeeldcode wordt het pakket vanuit het bestandssysteem geladen.
Wijzig de waarde van de variabele dataReaderName, zodat deze de naam van de DataReader-bestemming in het pakket bevat.
Plaats een knop en een tekstvak op het formulier. De voorbeeldcode gebruikt btnRun als de naam van de knop en txtResults als de naam van het tekstvak.
Voer de toepassing uit en klik op de knop. Na een korte pauze terwijl het pakket wordt uitgevoerd, ziet u de cumulatieve waarde die wordt berekend door het pakket (het aantal klanten in Canada) dat wordt weergegeven in het tekstvak op het formulier.
Voorbeeldcode
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;
}
}
}
Zie ook
inzicht in de verschillen tussen lokale en externe uitvoering
programmatisch een lokaal pakket laden en uitvoeren
programmatisch een extern pakket laden en uitvoeren