Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
İstemci uygulamaları, çıktı ADO.NET kullanılarak SQL Server hedeflerine kaydedildiğinde veya çıkış System.IO ad alanında sınıflar kullanılarak düz bir dosya hedefine kaydedildiğinde Integration Services paketlerinin çıkışını okuyabilir. Ancak istemci uygulaması, verileri kalıcı hale getirmek için bir ara adıma gerek kalmadan doğrudan bellekten bir paketin çıkışını da okuyabilir. Bu çözümün anahtarı,
Önemli
bu makalede açıklanan ve DtsClient kitaplığını kullanan yordam, yalnızca paket dağıtım modeliyle (/SQL, /DTSveya /File seçeneğiyle) dağıtılan paketler için çalışır. Bu yordam, sunucu dağıtım modeliyle (yani /ISServer seçeneğiyle) dağıtılan paketler için çalışmaz. Sunucu dağıtım modeliyle dağıtılan bir yerel paketin çıkışını kullanmak için (yani, /ISServer seçeneğiyle), bu makalede açıklanan yordam yerine Veri Akışı Hedefi kullanın.
Not
Bu konuda açıklanan yordam, Veri Akışı görevinin ve üst nesnelerin DelayValidation özelliğinin varsayılan Falsedeğerine ayarlanmasını gerektirir.
Açıklama
Bu yordam, datareader hedefine sahip bir paketin çıkışını doğrudan bellekten yükleyen yönetilen kodda istemci uygulamasının nasıl geliştirildiğini gösterir. Burada özetlenen adımlar, aşağıdaki kod örneğinde gösterilmiştir.
Veri paketi çıkışını bir istemci uygulamasına yüklemek için
Pakette, istemci uygulamasına okumak istediğiniz çıkışı almak için bir DataReader hedefi yapılandırın. Bu adı daha sonra istemci uygulamanızda kullanacağınız için DataReader hedefine açıklayıcı bir ad verin. DataReader hedefinin adını not edin.
Geliştirme projesinde, Microsoft.SqlServer.Dts.DtsClient.dllderlemesini bularak Microsoft.SqlServer.Dts.DtsClient ad alanına bir başvuru ayarlayın. Varsayılan olarak, bu derleme C:\Program Files\Microsoft SQL Server\100\DTS\Binnkonumunda yüklenir. C# Using veya Visual Basic Imports deyimini kullanarak ad alanını kodunuz içine aktarın.
Kodunuzda, dtexec.exe tarafından paketi çalıştırmak için gereken komut satırı parametrelerini içeren bir bağlantı dizesiyle DtsClient.DtsConnection türünde bir nesne oluşturun. Daha fazla bilgi için bkz. dtexec Yardımcı Programı. Ardından bu bağlantı dizesiyle bağlantıyı açın. Gerekli bağlantı dizesini görsel olarak oluşturmak için dtexecui yardımcı programını da kullanabilirsiniz.
Not
Örnek kod,
/FILE <path and filename>söz dizimini kullanarak paketi dosya sisteminden yüklemeyi gösterir. Bununla birlikte, paketi/SQL <package name>söz dizimini kullanarak MSDB veritabanından veya/DTS \<folder name>\<package name>söz dizimini kullanarak Integration Services paket deposundan da yükleyebilirsiniz.Daha önce oluşturulmuş DtsConnection kullanan DtsClient.DtsCommand türünde bir nesne oluşturun ve CommandText özelliğini paketteki DataReader hedefinin adı olarak ayarlayın. Ardından, paket sonuçlarını yeni bir DataReader'a yüklemek için komut nesnesinin ExecuteReader yöntemini çağırın.
İsteğe bağlı olarak, DtsCommand nesnesindeki DtsDataParameter nesnelerinin koleksiyonunu kullanarak paketin çıkışını dolaylı olarak parametreleştirebilir ve değerleri pakette tanımlanan değişkenlere geçirebilirsiniz. Paketin içinde, DataReader hedefine döndürülen sonuçları etkilemek için bu değişkenleri sorgu parametreleri olarak veya ifadelerde kullanabilirsiniz. Bu değişkenleri bir istemci uygulamasındaki DtsDataParameter nesnesiyle kullanabilmek için önce DtsClient ad alanındaki pakette tanımlamanız gerekir. (
Ad Alanı sütununu görüntülemek içinDeğişkenler penceresindeKi değişken sütunlarını araç çubuğuseç düğmesine tıklamanız gerekebilir.) İstemci kodunuzda, DtsCommand Parameters koleksiyonunabir DtsDataParameter eklediğinizde, değişken adından DtsClient ad alanı başvurularını atlayın. Mesela:command.Parameters.Add(new DtsDataParameter("MyVariable", 1));Çıktı verilerinin satırları arasında döngü yapmak için DataReader'ın Read yöntemini gerektiği gibi tekrar tekrar çağırın. verileri kullanın veya verileri daha sonra kullanmak üzere istemci uygulamasında kaydedin.
Önemli
DataReader'ın bu uygulamasının
Read yöntemi, son veri satırı okunduktan sonra bir kez daha truedöndürür. Bu, Okuma truedöndürürken DataReader'da döngü yapan her zamanki kodun kullanılmasını zorlaştırır. Kodunuz, Read yöntemine ek ve son çağrı yapmadan beklenen satır sayısını okuduktan sonra DataReader'ı veya bağlantıyı kapatmaya çalışırsa, kod işlenmeyen bir özel durum oluşturur. Ancak kodunuz bir döngü aracılığıyla bu son yinelemedeki verileri okumaya çalışırsa, Okuma yine de true döndürdüğünde, kod "SSIS IDataReader sonuç kümesinin sonunu geçti" iletisiyle applicationexception işlenmeyen biroluşturur. Bu davranış, diğer DataReader uygulamalarından farklıdır. Bu nedenle, Okuma bu beklenentrue döndürürken DataReader'daki satırları okumak için bir döngü kullanırken,Read yöntemine yapılan son başarılı çağrıda applicationexceptionyakalamak, test etmek ve atmak için kod yazmanız gerekir. Veya beklenen satır sayısını önceden biliyorsanız, datareader ve bağlantıyı kapatmadan önce satırları işleyebilir ve Read yöntemini bir kez daha çağırabilirsiniz. DtsCommand nesnesinin Dispose yöntemini çağırın. Bu özellikle DtsDataParameter nesneleri kullandıysanız önemlidir.
DataReader'ı ve bağlantı nesnelerini kapatın.
Örnek
Aşağıdaki örnek, tek bir toplama değeri hesaplayan ve değeri DataReader hedefine kaydeden bir paket çalıştırır ve ardından DataReader'dan bu değeri okur ve değeri Bir Windows Formundaki metin kutusunda görüntüler.
Bir paketin çıktısı bir istemci uygulamasına yüklenirken parametre kullanımı gerekli değildir. Parametre kullanmak istemiyorsanız, DtsClient ad alanında değişkenin kullanımını atlayabilir ve DtsDataParameter nesnesini kullanan kodu atlayabilirsiniz.
Test paketini oluşturmak için
Yeni bir Integration Services paketi oluşturun. Örnek kod, paketin adı olarak "DtsClientWParamPkg.dtsx" kullanır.
DtsClient ad alanına String türünde bir değişken ekleyin. Örnek kod, değişkenin adı olarak Country kullanır. (
Ad Alanı sütununu görüntülemek içinDeğişkenler penceresindeKi değişken sütunlarını araç çubuğuseç düğmesine tıklamanız gerekebilir.) AdventureWorks2025 örnek veritabanına bağlanan bir OLE DB bağlantı yöneticisi ekleyin.
Pakete bir veri akışı görevi ekleyin ve Veri Akışı tasarım yüzeyine geçin.
Veri akışına bir OLE DB kaynağı ekleyin ve daha önce oluşturulan OLE DB bağlantı yöneticisini ve aşağıdaki SQL komutunu kullanacak şekilde yapılandırın:
SELECT * FROM Sales.vIndividualCustomer WHERE CountryRegionName = ?Parametreler'e tıklayın ve Sorgu Parametrelerini Ayarla iletişim kutusunda Parameter0 sorgusundaki tek giriş parametresini DtsClient::Country değişkenine eşleyin.Veri akışına bir Toplama dönüşümü ekleyin ve OLE DB kaynağının çıkışını dönüştürmeye bağlayın. Toplama Dönüştürme Düzenleyicisi'ni açın ve tüm giriş sütunlarında (*) bir "Tümünü say" işlemi gerçekleştirmek ve toplanan değeri CustomerCount diğer adıyla çıkarmak için yapılandırın.
Veri akışına bir DataReader hedefi ekleyin ve Toplama dönüştürmesinin çıkışını DataReader hedefine bağlayın. Örnek kod, DataReader adı olarak "DataReaderDest" kullanır. Hedef için tek kullanılabilir giriş sütununu (CustomerCount) seçin.
Paketi kaydedin. Daha sonra oluşturulan test uygulaması paketi çalıştırır ve çıktısını doğrudan bellekten alır.
Test uygulamasını oluşturmak için
Yeni bir Windows Forms uygulaması oluşturun.
%ProgramFiles%\Microsoft SQL Server\100\DTS\Binniçinde aynı ada sahip derlemeye göz atarak Microsoft.SqlServer.Dts.DtsClient ad alanına bir başvuru ekleyin.
Aşağıdaki örnek kodu kopyalayıp formun kod modülüne yapıştırın.
dtexecArgs değişkeninin değerini, paketi çalıştırmak için dtexec.exe gereken komut satırı parametrelerini içerecek şekilde değiştirin. Örnek kod, paketi dosya sisteminden yükler.
dataReaderName değişkeninin değerini, paketteki DataReader hedefinin adını içermesi için gerektiği gibi değiştirin.
Forma bir düğme ve metin kutusu koyun. Örnek kod, düğmenin adı olarak
btnRun kullanır ve metin kutusunun adı olarak txtResults. Uygulamayı çalıştırın ve düğmeye tıklayın. Paket çalışırken kısa bir duraklama yaptıktan sonra, formdaki metin kutusunda görüntülenen paket (Kanada'daki müşterilerin sayısı) tarafından hesaplanan toplama değerini görmeniz gerekir.
Örnek 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;
}
}
}
Ayrıca Bkz.
Yerel ve Uzaktan Yürütme arasındaki farkları anlama
Program Aracılığıyla Yerel Paket Yükleme ve Çalıştırma
Program Aracılığıyla Bir Uzak Paketi Yükleme ve Çalıştırma