Aracılığıyla paylaş


Veri Erişim Katmanının Bağlantısını ve Komut Düzeyi Ayarlarını Yapılandırma (C#)

tarafından Scott Mitchell

PDF'i indirin

Typed DataSet içindeki TableAdapters otomatik olarak veritabanına bağlanma, komut verme ve sonuçlarla bir DataTable doldurma işlemlerini üstleniyor. Ancak bu ayrıntıları kendimiz halletmek istediğimiz durumlar vardır ve bu öğreticide TableAdapter'daki veritabanı bağlantısına ve komut düzeyi ayarlarına nasıl erişeceğinizi öğreniriz.

Giriş

Öğretici serisi boyunca, katmanlı mimarimizin Veri Erişim Katmanını ve iş nesnelerini uygulamak için Yazılan Veri Kümeleri'ni kullandık. İlk öğreticide açıklandığı gibi, Typed DataSet'in DataTables'i veri depoları olarak işlev görürken, TableAdapters temel verileri almak ve değiştirmek için veritabanıyla iletişim kuran bir aracı rolü üstlenir. TableAdapters veritabanıyla çalışmayla ilgili karmaşıklığı kapsüller ve veritabanına bağlanmak, komut vermek veya sonuçları bir DataTable'a doldurmak için kod yazma zorunluluğundan kurtarır.

Ancak, TableAdapter'ın derinliklerine girmemiz ve doğrudan ADO.NET nesneleriyle çalışan kod yazmamız gereken zamanlar vardır. Örneğin bir İşlem içindeki Veritabanı Değişikliklerini Sarmalama öğreticisinde TableAdapter'a işlemleri başlatma, işleme ve ADO.NET geri döndürme yöntemleri ekledik. Bu yöntemler TableAdapter SqlTransaction nesnelerine atanmış, el ile oluşturulmuş SqlCommand bir iç nesne kullandı.

Bu öğreticide TableAdapter'da veritabanı bağlantısına ve komut düzeyi ayarlarına nasıl erişileceğini inceleyeceğiz. Özellikle, temel alınan bağlantı dizesine ProductsTableAdapter ve komut zaman aşımı ayarlarına erişim sağlayan işlevler ekleyeceğiz.

ADO.NET Kullanarak Verilerle Çalışma

Microsoft .NET Framework, verilerle çalışmak için özel olarak tasarlanmış çok sayıda sınıf içerir. Ad alanındaSystem.Data bulunan bu sınıflar, ADO.NET sınıfları olarak adlandırılır. ADO.NET şemsiyesi altındaki sınıflardan bazıları belirli bir veri sağlayıcısına bağlıdır. Veri sağlayıcısını, bilgilerin ADO.NET sınıfları ile temel alınan veri deposu arasında akmasını sağlayan bir iletişim kanalı olarak düşünebilirsiniz. OleDb ve ODBC gibi genelleştirilmiş sağlayıcıların yanı sıra belirli bir veritabanı sistemi için özel olarak tasarlanmış sağlayıcılar vardır. Örneğin, OleDb sağlayıcısını kullanarak bir Microsoft SQL Server veritabanına bağlanmak mümkün olsa da, SqlClient sağlayıcısı özellikle SQL Server için tasarlandığından ve iyileştirildiğinden çok daha verimlidir.

Verilere program aracılığıyla erişirken yaygın olarak aşağıdaki desen kullanılır:

  • Veritabanıyla bağlantı kurun.
  • Bir komut gönderin.
  • SELECT sorgular için, sonuçta elde edilen kayıtlarla çalışın.

Bu adımların her birini gerçekleştirmek için ayrı ADO.NET sınıfları vardır. SqlClient sağlayıcısını kullanarak bir veritabanına bağlanmak için örneğin sınıfınıSqlConnection kullanın. Veritabanına bir INSERT, UPDATE, DELETEveya SELECT komutu vermek için sınıfınıSqlCommand kullanın.

TableAdapters otomatik olarak oluşturulan kod veritabanına bağlanmak, komut vermek, veri almak ve bu verileri DataTable'lara doldurmak için gereken işlevleri içerdiğinden, İşlem öğreticisi içindeki Veritabanı Değişikliklerini Sarmalama dışında, alt düzey ADO.NET kodu kendimiz yazmamız gerekmez. Ancak, bu düşük düzeyli ayarları özelleştirmemiz gereken zamanlar olabilir. Sonraki birkaç adımda TableAdapters tarafından dahili olarak kullanılan ADO.NET nesnelerine nasıl dokunacağımızı inceleyeceğiz.

1. Adım: Bağlantı Özelliği ile inceleme

Her TableAdapter sınıfının veritabanı bağlantı bilgilerini belirten bir Connection özelliği vardır. Bu özelliğin veri türü ve ConnectionString değeri TableAdapter Yapılandırma sihirbazında yapılan seçimler tarafından belirlenir. Typed DataSet'e ilk kez TableAdapter eklediğimizde bu sihirbazın veritabanı kaynağını istediğimizi unutmayın (bkz. Şekil 1). Bu ilk adımdaki açılan liste, yapılandırma dosyasında belirtilen veritabanlarının yanı sıra Sunucu Gezgini Veri Bağlantıları'ndaki diğer veritabanlarını içerir. Kullanmak istediğimiz veritabanı açılan listede yoksa, Yeni Bağlantı düğmesine tıklanarak ve gerekli bağlantı bilgileri sağlanarak yeni bir veritabanı bağlantısı belirtilebilir.

TableAdapter Yapılandırma Sihirbazı'nın İlk Adımı

Şekil 1: TableAdapter Yapılandırma Sihirbazı'nın İlk Adımı (Tam boyutlu görüntüyü görüntülemek için tıklayın)

TableAdapter özelliğinin Connection kodunu incelemek için biraz zaman ayıralım. Veri Erişim Katmanı Oluşturma öğreticisinde belirtildiği gibi, Sınıf Görünümü penceresine gidip uygun sınıfa gidip üye adına çift tıklayarak otomatik olarak oluşturulan TableAdapter kodunu görüntüleyebiliriz.

Görünüm menüsüne gidip Sınıf Görünümü'nü seçerek (veya Ctrl+Shift+C yazarak) Sınıf Görünümü penceresine gidin. Sınıf Görünümü penceresinin üst yarısından ad alanına gidin NorthwindTableAdapters ve sınıfı seçin ProductsTableAdapter . Bu, Şekil 2'de gösterildiği gibi, ProductsTableAdapter sınıfının üyelerini Sınıf Görünümünün alt yarısında görüntüler. Kodunu görmek için özelliğine çift tıklayın Connection .

Double-Click Numaralı Bağlantı Özelliğini Sınıf Görünümünde Otomatik Oluşturulan Kodunu Görüntülemek İçin

Şekil 2: Sınıf Görünümünde Bağlantı Özelliği Double-Click'ı kullanarak Otomatik Oluşturulan Kodunu Görüntüleyin

TableAdapter özelliği Connection ve bağlantıyla ilgili diğer kodlar şunlardır:

private System.Data.SqlClient.SqlConnection _connection;
private void InitConnection() {
    this._connection = new System.Data.SqlClient.SqlConnection();
    this._connection.ConnectionString = 
        ConfigurationManager.ConnectionStrings["NORTHWNDConnectionString"].ConnectionString;
}
internal System.Data.SqlClient.SqlConnection Connection {
    get {
        if ((this._connection == null)) {
            this.InitConnection();
        }
        return this._connection;
    }
    set {
        this._connection = value;
        if ((this.Adapter.InsertCommand != null)) {
            this.Adapter.InsertCommand.Connection = value;
        }
        if ((this.Adapter.DeleteCommand != null)) {
            this.Adapter.DeleteCommand.Connection = value;
        }
        if ((this.Adapter.UpdateCommand != null)) {
            this.Adapter.UpdateCommand.Connection = value;
        }
        for (int i = 0; (i < this.CommandCollection.Length); i = (i + 1)) {
            if ((this.CommandCollection[i] != null)) {
                ((System.Data.SqlClient.SqlCommand)
                    (this.CommandCollection[i])).Connection = value;
            }
        }
    }
}

TableAdapter sınıfı örneklendiğinde, üye değişkeni _connection eşittir null. Özellik Connection erişildiğinde, önce _connection üye değişkeninin örneklendiğini denetler. Aksi takdirde, InitConnection yöntemi çağrılır. Bu çağrı, _connection örneğini oluşturur ve ConnectionString özelliğini, TableAdapter Yapılandırma Sihirbazı'nın ilk adımında belirtilen bağlantı dizesi değerine ayarlar.

Connection Özelliği bir SqlConnection nesneye de atanabilir. Bunu yapmak, yeni SqlConnection nesneyi TableAdapter nesnelerinin SqlCommand her biriyle ilişkilendirir.

2. Adım: Connection-Level Ayarlarını Ortaya Çıkarma

Bağlantı bilgileri TableAdapter içinde kapsüllenmiş olarak kalmalı ve uygulama mimarisindeki diğer katmanlar tarafından erişilmemelidir. Ancak TableAdapter'ın bağlantı düzeyi bilgilerinin sorgu, kullanıcı veya ASP.NET sayfası için erişilebilir veya özelleştirilebilir olması gerektiği senaryolar olabilir.

DataSet içindeki ProductsTableAdapter öğesiniNorthwind, TableAdapter tarafından kullanılan bağlantı dizesini okumak veya değiştirmek için İş Mantığı Katmanı tarafından kullanılabilecek bir ConnectionString özellik içerecek şekilde genişletelim.

Uyarı

Bağlantı dizesi, kullanılacak sağlayıcı, veritabanının konumu, kimlik doğrulama kimlik bilgileri ve veritabanıyla ilgili diğer ayarlar gibi veritabanı bağlantı bilgilerini belirten bir dizedir. Çeşitli veri depoları ve sağlayıcılar tarafından kullanılan bağlantı dizesi desenlerinin listesi için bkz. ConnectionStrings.com.

Veri Erişim Katmanı Oluşturma öğreticisinde açıklandığı gibi, Yazılan DataSet'in otomatik olarak oluşturulan sınıfları kısmi sınıfların kullanımıyla genişletilebilir. İlk olarak, projede klasörün altında ConnectionAndCommandSettings adlı ~/App_Code/DAL yeni bir alt klasör oluşturun.

ConnectionAndCommandSettings Adlı Bir Alt Klasör Ekleme

Şekil 3: Adlı Bir Alt Klasör Ekleme ConnectionAndCommandSettings

adlı ProductsTableAdapter.ConnectionAndCommandSettings.cs yeni bir sınıf dosyası ekleyin ve aşağıdaki kodu girin:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace NorthwindTableAdapters
{
    public partial class ProductsTableAdapter
    {
        public string ConnectionString
        {
            get
            {
                return this.Connection.ConnectionString;
            }
            set
            {
                this.Connection.ConnectionString = value;
            }
        }
    }
}

Bu kısmi sınıf, herhangi bir katmanın TableAdapter'ın temel bağlantısı için bağlantı dizesini okumasını veya güncellemesini sağlayan public adlı bir ConnectionString özelliğini ProductsTableAdapter sınıfına ekler.

Bu kısmi sınıf oluşturulduktan (ve kaydedildikten) sonra ProductsBLL sınıfını açın. Mevcut yöntemlerden birine gidin ve Adapter yazın, ardından IntelliSense'i açmak için nokta tuşuna basın. IntelliSense'te yeni özelliğin kullanılabilir olduğunu görmeniz ConnectionString gerekir. Bu, BLL'den bu değeri program aracılığıyla okuyabileceğiniz veya ayarlayabildiğiniz anlamına gelir.

Bağlantı Nesnesinin Tamamını Ortaya Çıkarma

Bu kısmi sınıf, temel alınan bağlantı nesnesinin yalnızca bir özelliğini kullanıma sunar: ConnectionString. Tüm bağlantı nesnesini TableAdapter sınırlarının ötesinde kullanılabilir hale getirmek istiyorsanız, alternatif olarak özelliğin Connection koruma düzeyini değiştirebilirsiniz. 1. Adımda incelediğimiz otomatik olarak oluşturulan kod TableAdapter s Connection özelliğinin olarak internalişaretlendiğini, yani yalnızca aynı derlemedeki sınıflar tarafından erişilebildiğini gösterdi. Ancak bu, TableAdapter s ConnectionModifier özelliği aracılığıyla değiştirilebilir.

Northwind DataSet'i açın, Tasarımcı'daki ProductsTableAdapter öğesine tıklayın ve Özellikler penceresine gidin. Burada, ConnectionModifier ayarının varsayılan değeri olan Assembly değerini görürsünüz. Typed DataSet derlemesinin dışında Connection özelliğini kullanılabilir hale getirmek için, ConnectionModifier özelliğini Public olarak değiştirin.

Bağlantı Özelliğinin Erişilebilirlik Düzeyi ConnectionModifier Özelliği Aracılığıyla Yapılandırılabilir

Şekil 4: Özelliğin Connection Erişilebilirlik Düzeyi Özellik Aracılığıyla ConnectionModifier Yapılandırılabilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

DataSet'i kaydedin ve ardından sınıfına ProductsBLL dönün. Daha önce olduğu gibi, mevcut yöntemlerden birine gidin, Adapter yazın ve ardından IntelliSense'i açmak için nokta tuşuna basın. Liste bir özellik içermelidir; yani artık BLL'den herhangi bir Connection bağlantı düzeyi ayarlarını program aracılığıyla okuyabilir veya atayabilirsiniz.

TableAdapter varsayılan olarak otomatik olarak oluşturulan INSERT, UPDATEve DELETE deyimlerine sahip bir ana sorgudan oluşur. Bu ana sorgunun INSERT, UPDATE ve DELETE deyimleri, TableAdapter kodunda Adapter özelliği aracılığıyla bir ADO.NET veri bağdaştırıcısı nesnesi olarak uygulanır. Özelliğinde Connection olduğu gibi özelliğin Adapter veri türü de kullanılan veri sağlayıcısı tarafından belirlenir. Bu öğreticiler SqlClient sağlayıcısını kullandığından Adapter , özelliği türündedir SqlDataAdapter.

TableAdapter Adapter özelliği, SqlCommand, INSERT ve UPDATE deyimlerini vermek amacıyla kullandığı üç DELETE özelliğe sahiptir.

  • InsertCommand
  • UpdateCommand
  • DeleteCommand

Bir SqlCommand nesne veritabanına belirli bir sorgu göndermekle sorumludur ve şu özelliklere sahiptir: CommandText, yürütülecek geçici SQL deyimini veya saklı yordamı içerir; ve Parametersbir nesne koleksiyonudur SqlParameter . Veri Erişim Katmanı Oluşturma öğreticisinde gördüğümüz gibi, bu komut nesneleri Özellikler penceresi aracılığıyla özelleştirilebilir.

TableAdapter, ana sorgusuna ek olarak, çağrıldığında veritabanına belirtilen komutu gönderen çeşitli yöntemler içerebilir. Ana sorgunun komut nesnesi ve tüm ek yöntemlerin komut nesneleri TableAdapter s CommandCollection özelliğinde depolanır.

Biraz durup bu iki özellik ve onların destekleyici üye değişkenleri ve yardımcı yöntemleri için ProductsTableAdapter DataSet'te Northwind tarafından oluşturulan koda bakalım:

private System.Data.SqlClient.SqlDataAdapter _adapter;
private void InitAdapter() {
    this._adapter = new System.Data.SqlClient.SqlDataAdapter();
    
    ... Code that creates the InsertCommand, UpdateCommand, ...
    ... and DeleteCommand instances - omitted for brevity ...
}
private System.Data.SqlClient.SqlDataAdapter Adapter {
    get {
        if ((this._adapter == null)) {
            this.InitAdapter();
        }
        return this._adapter;
    }
}
private System.Data.SqlClient.SqlCommand[] _commandCollection;
private void InitCommandCollection() {
    this._commandCollection = new System.Data.SqlClient.SqlCommand[9];
    ... Code that creates the command objects for the main query and the ...
    ... ProductsTableAdapter�s other eight methods - omitted for brevity ...
}
protected System.Data.SqlClient.SqlCommand[] CommandCollection {
    get {
        if ((this._commandCollection == null)) {
            this.InitCommandCollection();
        }
        return this._commandCollection;
    }
}

Adapter ve CommandCollection özelliklerinin kodu, Connection özelliğinin kodunu yakından taklit eder. Özellikler tarafından kullanılan nesneleri tutan üye değişkenleri mevcuttur. Özellikler get erişimcileri, ilgili üye değişkeninin olup nullolmadığını denetleyerek başlar. Bu durumda, üye değişkeninin bir örneğini oluşturan ve komutla ilgili temel özellikleri atayan bir başlatma yöntemi çağrılır.

4. Adım: Command-Level Ayarlarını Ortaya Çıkarma

İdeal olan, komut düzeyi bilgilerinin Veri Erişim Katmanı içinde kapsüllenmiş olarak kalmasıdır. Ancak, mimarinin diğer katmanlarında bu bilgilere ihtiyaç duyulması halinde, bağlantı düzeyi ayarları gibi kısmi bir sınıf aracılığıyla kullanıma sunulur.

TableAdapter yalnızca tek Connection bir özelliğe sahip olduğundan, bağlantı düzeyi ayarlarının kullanıma sunulurken kullanılacak kod oldukça basittir. TableAdapter'daki çeşitli sayıda komut nesnesinin yanı sıra, InsertCommand, UpdateCommand, ve DeleteCommand gibi birden çok komut nesnesi olabileceği için komut seviyesi ayarlarını değiştirirken işler biraz daha karmaşıktır. Komut düzeyi ayarlarını güncelleştirirken, bu ayarların tüm komut nesnelerine yayılması gerekir.

Örneğin, TableAdapter'da yürütülmesi olağanüstü uzun zaman alan bazı sorgular olduğunu düşünün. TableAdapter'ı kullanarak bu sorgulardan birini yürütürken komut nesnesinin sCommandTimeout özelliğini artırmak isteyebiliriz. Bu özellik, komutun yürütülmesini beklemek için saniye sayısını belirtir ve varsayılan olarak 30'dur.

Özellik CommandTimeout'nın BLL tarafından ayarlanmasına izin vermek için, 2. Adımda (public) oluşturulan kısmi sınıf dosyasını kullanarak ProductsDataTable öğesine aşağıdaki ProductsTableAdapter.ConnectionAndCommandSettings.cs yöntemini ekleyin.

public void SetCommandTimeout(int timeout)
{
    if (this.Adapter.InsertCommand != null)
        this.Adapter.InsertCommand.CommandTimeout = timeout;
    if (this.Adapter.DeleteCommand != null)
        this.Adapter.DeleteCommand.CommandTimeout = timeout;
    if (this.Adapter.UpdateCommand != null)
        this.Adapter.UpdateCommand.CommandTimeout = timeout;
    for (int i = 0; i < this.CommandCollection.Length; i++)
        if (this.CommandCollection[i] != null)
            this.CommandCollection[i].CommandTimeout = timeout;
}

Bu yöntem, bu TableAdapter örneğindeki tüm komut sorunları için komut zaman aşımını ayarlamak üzere BLL veya Sunu Katmanı'ndan çağrılabilir.

Uyarı

Adapter ve CommandCollection özellikleri olarak privateişaretlenir, yani bunlara yalnızca TableAdapter içindeki koddan erişilebilir. özelliğinden Connection farklı olarak, bu erişim değiştiricileri yapılandırılamaz. Bu nedenle, komut düzeyi özelliklerini mimarideki diğer katmanlara sunmanız gerekiyorsa, komut nesnelerini okuyan veya yazan bir public yöntem veya özellik sağlamak için yukarıda açıklanan kısmi sınıf yaklaşımını private kullanmanız gerekir.

Özet

Typed DataSet içindeki TableAdapters, veri erişim ayrıntılarını ve karmaşıklığını kapsüllemek için kullanılır. TableAdapters'ı kullanarak veritabanına bağlanmak, komut vermek veya sonuçları DataTable'a doldurmak için ADO.NET kodu yazma konusunda endişelenmemiz gerekmez. Her şey bizim için otomatik olarak işlenir.

Ancak, bağlantı dizesini veya varsayılan bağlantı ya da komut zaman aşımı değerlerini değiştirme gibi alt düzey ADO.NET ayrıntılarını özelleştirmemiz gereken zamanlar olabilir. TableAdapter otomatik olarak oluşturulan Connection, Adapter ve CommandCollection özelliklerine sahiptir, ancak bunlar varsayılan olarak ya internal ya da private'dır. Bu iç bilgiler, yöntemleri veya özellikleri içerecek public şekilde kısmi sınıflar kullanılarak TableAdapter genişletilerek ortaya çıkarılabilir. Alternatif olarak, TableAdapter'ın Connection özellik erişim değiştiricisi TableAdapter s ConnectionModifier özelliği aracılığıyla yapılandırılabilir.

Mutlu Programlama!

Yazar Hakkında

Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.

Özel Teşekkürler

Bu eğitim serisi, birçok yararlı kişi tarafından incelendi. Bu öğreticinin baş gözden geçirenleri Burnadette Leigh, S ren Jacob Lauritsen, Teresa Murphy ve Hilton Geisenow oldu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.