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’yi İndir

Typed DataSet içindeki TableAdapters otomatik olarak veritabanına bağlanmayı, komutlar vermeyi ve sonuçlarla bir DataTable doldurmayı halleder. Ancak bu ayrıntıları kendimiz halletmek istediğimiz durumlar vardır ve bu öğreticide TableAdapter'da 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 DataTable'ları veri depoları olarak görev alırken TableAdapters, temel alınan verileri almak ve değiştirmek için veritabanıyla iletişim kurmak için sarmalayıcı görevi görür. TableAdapters veritabanıyla çalışmanın karmaşıklığını 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 nesnelerle ç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 SqlCommand nesnelerine atanmış, el ile oluşturulmuş SqlTransaction 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 bağlantı dizesi ve komut zaman aşımı ayarlarına erişim sağlayan işlevler ProductsTableAdapter ekleyeceğiz.

ADO.NET Kullanarak Verilerle Çalışma

Microsoft .NET Framework, özellikle verilerle çalışmak için tasarlanmış çok sayıda sınıf içerir. Ad alanında bulunanSystem.Data 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.
  • Sorgular için SELECT 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 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.

TableAdapers otomatik olarak oluşturulan kod veritabanına bağlanmak, komut vermek, veri almak ve bu verileri DataTable'lara doldurmak için gereken işlevselliği içerdiğinden, bir İşlem öğreticisi içindeki Veritabanı Değişikliklerini Sarmalama dışında, alt düzey ADO.NET kodu 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 bağlanılacağını 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'nin Veri Connections 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 s Connection özelliğinin 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 tuşlarına basarak) 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 sınıf üyelerini Sınıf Görünümünün alt yarısında görüntüler ProductsTableAdapter . Kodunu görmek için özelliğe çift tıklayın Connection .

Otomatik Olarak Oluşturulan Kodunu Görüntülemek için Sınıf Görünümünde Bağlantı Özelliğine Çift Tıklayın

Şekil 2: Otomatik Olarak Oluşturulan Kodunu Görüntülemek için Sınıf Görünümünde Bağlantı Özelliğini Double-Click

TableAdapter'ın Connection özelliği ve bağlantıyla ilgili diğer kod aşağıdaki gibidir:

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ı örneği başlatıldığında, üye değişkeni _connection eşittir null. Connection Özelliğe erişildiğinde, önce üye değişkeninin örneğinin _connection alınıp alınmadığını denetler. Etkinleştirilmemişse yöntemi InitConnection çağrılır ve bu yöntem, özelliğinin örneğini _connection oluşturur ve TableAdapter Yapılandırma sihirbazının ilk adımından belirtilen bağlantı dizesi değerine ayarlarConnectionString.

Connection Özelliği bir SqlConnection nesneye de atanabilir. Bunun yapılması, yeni SqlConnection nesneyi TableAdapter nesnelerinin SqlCommand her biriyle ilişkilendirir.

2. Adım: Connection-Level Ayarlarını Açığa Çıkarma

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

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

Not

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ün altında ~/App_Code/DAL adlı ConnectionAndCommandSettings yeni bir alt klasör oluşturun.

ConnectionAndCommandSettings Adlı Bir Alt Klasör Ekleme

Şekil 3: Adlı 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 ProductsTableAdapter TableAdapter'ın temel bağlantısı için bağlantı dizesi okumasına veya güncelleştirmesine izin veren sınıfına adlı ConnectionString bir public özellik ekler.

Bu kısmi sınıf oluşturulduktan (ve kaydedildikten) sonra sınıfını ProductsBLL açın. Mevcut yöntemlerden birine gidin ve yazın Adapter ve ardından IntelliSense'i ortaya çıkarmak için nokta tuşuna basın. IntelliSense'te yeni ConnectionString özelliğin kullanılabilir olduğunu görmeniz gerekir; başka bir deyişle bu değeri BLL'den program aracılığıyla okuyabilir veya ayarlayabilirsiniz.

Tüm Bağlantı Nesnesini Açığa Çı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ı dışında 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.

DataSet'i Northwind açın, Tasarım Aracı öğesine tıklayın ProductsTableAdapter ve Özellikler penceresi gidin. Burada, varsayılan değerine Assemblyayarlanmış öğesini ConnectionModifier görürsünüz. Özelliği Typed DataSet derlemesinin dışında kullanılabilir hale getirmek Connection için özelliğini olarak PublicdeğiştirinConnectionModifier.

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 ve yazın Adapter ve ardından IntelliSense'i ortaya çıkarmak için nokta tuşuna basın. Listede bir özellik bulunmalıdır; 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 , ve DELETE deyimlerini otomatik olarak oluşturan INSERTUPDATEbir ana sorgudan oluşur. Bu ana sorgunun INSERT, UPDATEve DELETE deyimleri TableAdapter kodunda özelliği aracılığıyla Adapter 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 s Adapter özelliğinin , UPDATEve DELETE deyimlerini vermek INSERTiçin kullandığı üç tür SqlCommand özelliği vardır:

  • InsertCommand
  • UpdateCommand
  • DeleteCommand

Bir SqlCommand nesne veritabanına belirli bir sorgu göndermekle sorumludur ve şu özelliklere sahiptir: CommandTextgeçici SQL deyimini veya yürütülecek 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 değişken sayıda yöntem içerebilir. Tüm ek yöntemler için ana sorgunun komut nesnesi ve komut nesneleri TableAdapter s CommandCollection özelliğinde depolanır.

Bu iki özellik için DataSet'te Northwind tarafından ProductsTableAdapter oluşturulan koda ve bunların destekleyici üye değişkenlerine ve yardımcı yöntemlerine göz atalı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;
    }
}

ve CommandCollection özelliklerinin koduAdapter, özelliğin Connection kodunu yakından taklit eder. Özellikler tarafından kullanılan nesneleri tutan üye değişkenleri vardır. Özellikler get erişimcileri, karşılık gelen üye değişkeninin nullolup olmadığı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ı Açığa Çı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 üzerinden kullanıma sunulur.

TableAdapter yalnızca tek Connection bir özelliğe sahip olduğundan, bağlantı düzeyi ayarlarını kullanıma açma kodu oldukça basittir. TableAdapter'ın, özelliğindeki çeşitli sayıda komut nesnesinin yanı sıra , UpdateCommandve DeleteCommandgibi birden çok komut nesnesi InsertCommandolabileceğinden, komut CommandCollection düzeyi 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 çok uzun süren bazı sorgular olduğunu düşünün. TableAdapter kullanarak bu sorgulardan birini yürütürken komut nesnesinin özelliğiniCommandTimeout artırmak isteyebiliriz. Bu özellik, komutun yürütülmesi için bek eklenecek saniye sayısını belirtir ve varsayılan olarak 30'dur.

Özelliğin CommandTimeout BLL tarafından ayarlanmasına izin vermek içinProductsDataTable, 2. Adımda oluşturulan kısmi sınıf dosyasını (ProductsTableAdapter.ConnectionAndCommandSettings.cs kullanarak öğesine aşağıdaki public yöntemi 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ğinin tüm komut sorunları için komut zaman aşımını ayarlamak üzere BLL veya Sunu Katmanı'ndan çağrılabilir.

Not

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ı bir DataTable'a doldurmak için ADO.NET kod yazma konusunda endişelenmemiz gerekmez. Her şey bizim için otomatik olarak işlenir.

Ancak, bağlantı dizesi 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, Adapterve CommandCollection özelliklerine sahiptir, ancak bunlar varsayılan olarak veya private'dırinternal. 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ışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.

Özel Teşekkürler

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçirenleri Burnadette Leigh, S ren Jacob Lauritsen, Teresa Murphy ve Hilton Geisenow'dur. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana adresinden bir satır mitchell@4GuysFromRolla.combırakın.