Veri Erişim Katmanını Oluşturma (C#)

tarafından Scott Mitchell

PDF’yi İndir

Bu öğreticide, veritabanındaki bilgilere erişmek için en baştan başlayacağız ve yazılan DataSet'leri kullanarak Veri Erişim Katmanı'nı (DAL) oluşturacağız.

Giriş

Web geliştiricileri olarak, hayatımız verilerle çalışma etrafında döner. Verileri depolamak için veritabanları, almak ve değiştirmek için kod ve bunları toplamak ve özetlemek için web sayfaları oluşturuyoruz. Bu, ASP.NET 2.0'da bu yaygın desenleri uygulamaya yönelik teknikleri keşfedecek uzun bir serideki ilk öğreticidir. Türü Yazılan Veri Kümeleri, özel iş kurallarını zorunlu kılan bir İş Mantığı Katmanı (BLL) ve ortak bir sayfa düzenini paylaşan ASP.NET sayfalardan oluşan bir sunu katmanı kullanarak Veri Erişim Katmanından (DAL) oluşan bir yazılım mimarisi oluşturmayla başlayacağız. Bu arka uç temeli hazırlandıktan sonra, bir web uygulamasından verileri görüntüleme, özetleme, toplama ve doğrulama adımlarını gösteren raporlamaya geçeceğiz. Bu öğreticiler kısa olacak şekilde hazırlanmış ve işlemde size görsel olarak yol gösteren birçok ekran görüntüsüyle birlikte adım adım yönergeler sağlamaktadır. Her öğretici C# ve Visual Basic sürümlerinde kullanılabilir ve kullanılan kodun tamamının indirilmesini içerir. (Bu ilk öğretici oldukça uzundur, ancak gerisi çok daha sindirilebilir öbekler halinde sunulur.)

Bu öğreticiler için App_Data dizinine yerleştirilen Northwind veritabanının Microsoft SQL Server 2005 Express Sürüm sürümünü kullanacağız. Veritabanı dosyasına ek olarak , App_Data klasörü farklı bir veritabanı sürümü kullanmak istemeniz durumunda veritabanını oluşturmaya yönelik SQL betiklerini de içerir. Northwind veritabanının farklı bir SQL Server sürümü kullanıyorsanız, uygulamanın Web.config dosyasında NORTHWNDConnectionString ayarını güncelleştirmeniz gerekir. Web uygulaması, Visual Studio 2005 Professional Edition kullanılarak dosya sistemi tabanlı bir Web sitesi projesi olarak oluşturulmuştu. Ancak, tüm öğreticiler Visual Studio 2005, Visual Web Developer'ın ücretsiz sürümüyle eşit derecede iyi çalışır.

Bu öğreticide en baştan başlayıp Veri Erişim Katmanı'nı (DAL) oluşturacak, ardından ikinci öğreticide İş Mantığı Katmanı (BLL) oluşturacak ve üçüncü öğreticide sayfa düzeni ve gezinti üzerinde çalışacağız. Üçüncü öğreticiden sonraki öğreticiler, ilk üçte atılan temeli temel alır. Bu ilk öğreticide ele alacağımız çok şey var, bu nedenle Visual Studio'yu başlatın ve başlayalım!

1. Adım: Web Projesi Oluşturma ve Veritabanına Bağlanma

Veri Erişim Katmanı'mızı (DAL) oluşturabilmek için önce bir web sitesi oluşturmamız ve veritabanımızı kurmamız gerekir. Başlangıç olarak yeni bir dosya sistemi tabanlı ASP.NET web sitesi oluşturun. Bunu yapmak için Dosya menüsüne gidin ve Yeni Web Sitesi'ni seçerek Yeni Web Sitesi iletişim kutusunu görüntüleyin. ASP.NET Web Sitesi şablonunu seçin, Konum açılan listesini Dosya Sistemi olarak ayarlayın, web sitesini yerleştirmek için bir klasör seçin ve dili C# olarak ayarlayın.

Web Sitesi System-Based Yeni Dosya Oluşturma

Şekil 1: Web Sitesi System-Based Yeni Dosya Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu işlem, Default.aspx bir ASP.NET sayfası ve App_Data klasörü olan yeni bir web sitesi oluşturur.

Web sitesi oluşturulduğunda, bir sonraki adım Visual Studio'nun Sunucu Gezgini'nde veritabanına bir başvuru eklemektir. Sunucu Gezgini'ne veritabanı ekleyerek, Visual Studio'dan tablolar, saklı yordamlar, görünümler vb. ekleyebilirsiniz. Sorgu Oluşturucusu aracılığıyla tablo verilerini görüntüleyebilir veya el ile veya grafik olarak kendi sorgularınızı oluşturabilirsiniz. Ayrıca DAL için Türemiş Veri Kümeleri oluştururken Visual Studio'yu Türü Belirtilen Veri Kümelerinin oluşturulması gereken veritabanına yöneltmeliyiz. Bu bağlantı bilgilerini o anda sağlayabildiğimiz halde Visual Studio, Sunucu Gezgini'nde zaten kayıtlı olan veritabanlarının açılan listesini otomatik olarak doldurur.

Northwind veritabanını Sunucu Gezgini'ne ekleme adımları, App_Data klasöründeki SQL Server 2005 Express Sürüm veritabanını kullanmak isteyip istemediğinize veya bunun yerine kullanmak istediğiniz bir Microsoft SQL Server 2000 veya 2005 veritabanı sunucusu kurulumunuz olup olmadığına bağlıdır.

App_Data Klasöründe Veritabanı Kullanma

Bağlanacak SQL Server 2000 veya 2005 veritabanı sunucunuz yoksa veya veritabanını bir veritabanı sunucusuna eklemek zorunda kalmak istemiyorsanız, indirilen web sitesinin App_Data klasöründe (NORTHWND) bulunan Northwind veritabanının SQL Server 2005 Express Sürüm sürümünü kullanabilirsiniz. MDF).

App_Data klasörüne yerleştirilen bir veritabanı otomatik olarak Sunucu Gezgini'ne eklenir. Makinenizde SQL Server 2005 Express Sürüm yüklü olduğunu varsayarsak NORTHWND adlı bir düğüm görmeniz gerekir. Sunucu Gezgini'nde tablolarını, görünümlerini, saklı yordamını vb. genişletip inceleyebileceğiniz MDF (bkz. Şekil 2).

App_Data klasörü, SQL Server karşılıkları gibi sunucu gezginine otomatik olarak eklenen Microsoft Access .mdb dosyalarını da barındırabilir. SQL Server seçeneklerinden herhangi birini kullanmak istemiyorsanız, her zaman Northwind Traders veritabanını ve uygulamalarını yükleyebilir veApp_Data dizinine bırakabilirsiniz. Bununla birlikte, Access veritabanlarının SQL Server kadar zengin özelliklere sahip olmadığını ve web sitesi senaryolarında kullanılmak üzere tasarlanmamış olduğunu unutmayın. Ayrıca, 35'inden fazla öğreticiden birkaçı Access tarafından desteklenmeyen bazı veritabanı düzeyindeki özellikleri kullanacaktır.

Microsoft SQL Server 2000 veya 2005 Veritabanı Sunucusunda Veritabanına Bağlanma

Alternatif olarak, veritabanı sunucusunda yüklü bir Northwind veritabanına bağlanabilirsiniz. Veritabanı sunucusunda Northwind veritabanı yüklü değilse, önce bu öğreticinin indirmesine dahil edilen yükleme betiğini çalıştırarak bunu veritabanı sunucusuna eklemeniz gerekir.

Veritabanını yükledikten sonra Visual Studio'da Sunucu Gezgini'ne gidin, Veri Connections düğümüne sağ tıklayın ve Bağlantı Ekle'yi seçin. Sunucu Gezgini'ni görmüyorsanız Görünüm / Sunucu Gezgini'ne gidin veya Ctrl+Alt+S tuşlarına basın. Bu, bağlanılacak sunucuyu, kimlik doğrulama bilgilerini ve veritabanı adını belirtebileceğiniz Bağlantı Ekle iletişim kutusunu açar. Veritabanı bağlantı bilgilerini başarıyla yapılandırdıktan ve Tamam düğmesine tıkladığınızda veritabanı, Veri Connections düğümü altına düğüm olarak eklenir. Tablolarını, görünümlerini, saklı yordamlarını vb. keşfetmek için veritabanı düğümünü genişletebilirsiniz.

Veritabanı Sunucunuzun Northwind Veritabanına Bağlantı Ekleme

Şekil 2: Veritabanı Sunucunuzun Northwind Veritabanına Bağlantı Ekleme

2. Adım: Veri Erişim Katmanı Oluşturma

Verilerle çalışırken bir seçenek, verilere özgü mantığı doğrudan sunu katmanına eklemektir (web uygulamasında, sunu katmanını ASP.NET sayfalar oluşturur). Bu, ASP.NET sayfasının kod bölümüne ADO.NET kod yazma veya işaretleme bölümünden SqlDataSource denetimini kullanma biçiminde olabilir. Her iki durumda da, bu yaklaşım veri erişim mantığını sunu katmanıyla sıkı bir şekilde bağlar. Ancak önerilen yaklaşım, veri erişim mantığını sunu katmanından ayırmaktır. Bu ayrı katman Veri Erişim Katmanı, kısaca DAL olarak adlandırılır ve genellikle ayrı bir Sınıf Kitaplığı projesi olarak uygulanır. Bu katmanlı mimarinin avantajları iyi belgelenmiştir (bu avantajlar hakkında bilgi için bu öğreticinin sonundaki "Diğer Okumalar" bölümüne bakın) ve bu seride alacağımız yaklaşımdır.

Veritabanına bağlantı oluşturma, SELECT, INSERT, UPDATE ve DELETE komutları verme gibi temel alınan veri kaynağına özgü tüm kodlar DAL'de bulunmalıdır. Sunu katmanı bu tür veri erişim koduna herhangi bir başvuru içermemelidir, bunun yerine tüm veri istekleri için DAL'ye çağrı yapmalıdır. Veri Erişim Katmanları genellikle temel alınan veritabanı verilerine erişme yöntemlerini içerir. Örneğin Northwind veritabanında, satışa sunulan ürünleri ve ait oldukları kategorileri kaydeden Ürünler ve Kategoriler tabloları vardır. DAL'mizde şu yöntemlere sahip olacağız:

  • Tüm kategoriler hakkındaki bilgileri döndürecek GetCategories())
  • Tüm ürünlerle ilgili bilgileri döndüren GetProducts().
  • GetProductsByCategoryID(categoryID); belirtilen kategoriye ait tüm ürünleri döndürür
  • GetProductByProductID(productID); belirli bir ürünle ilgili bilgileri döndürür

Bu yöntemler çağrıldığında veritabanına bağlanır, uygun sorguyu gönderir ve sonuçları döndürür. Bu sonuçları nasıl döndürebileceğimiz önemlidir. Bu yöntemler yalnızca veritabanı sorgusu tarafından doldurulan bir DataSet veya DataReader döndürebilir, ancak ideal olarak bu sonuçlar kesin türemiş nesneler kullanılarak döndürülmelidir. Kesin türü belirlenmiş bir nesne, şeması derleme zamanında katı bir şekilde tanımlanmış olan nesnedir; bunun tam tersi, gevşek türü belirlenmiş bir nesne ise çalışma zamanına kadar şeması bilinmeyen bir nesnedir.

Örneğin, DataReader ve DataSet (varsayılan olarak), şemaları bunları doldurmak için kullanılan veritabanı sorgusu tarafından döndürülen sütunlar tarafından tanımlandığından gevşek türemiş nesnelerdir. Gevşek türe sahip bir DataTable'dan belirli bir sütuna erişmek için şu söz dizimini kullanmalıyız: DataTable. Rows[index]["columnName"]. DataTable'ın bu örnekteki gevşek yazması, bir dize veya sıra dizini kullanarak sütun adına erişmemiz gerektiği gerçeğiyle ortaya konur. Öte yandan, kesin olarak türü belirlenmiş bir DataTable, sütunlarının her birinin özellik olarak uygulanmasına neden olur ve bu da şuna benzer bir kodla sonuçlanır: DataTable. Satırlar[dizin].columnName.

Kesin türe sahip nesneler döndürmek için geliştiriciler kendi özel iş nesnelerini oluşturabilir veya Türü Belirlenmiş Veri Kümelerini kullanabilir. İş nesnesi geliştirici tarafından, özellikleri genellikle iş nesnesinin temsil ettiği temel veritabanı tablosunun sütunlarını yansıtan bir sınıf olarak uygulanır. Türü Belirlenmiş Veri Kümesi, veritabanı şemasına dayalı olarak Visual Studio tarafından sizin için oluşturulan ve üyeleri bu şemaya göre kesin olarak yazılan bir sınıftır. Türü Yazılan DataSet'in kendisi, ADO.NET DataSet, DataTable ve DataRow sınıflarını genişleten sınıflardan oluşur. Türü kesin olarak belirlenmiş DataTable'lara ek olarak, Türü Belirlenmiş DataSet'ler artık DataSet'in DataTable'larını doldurma ve DataTable'lardaki değişiklikleri veritabanına geri yayma yöntemlerine sahip sınıflar olan TableAdapters'ı da içerir.

Not

Türü Yazılan Veri Kümelerini kullanmanın özel iş nesneleriyle karşı karşıya kalmanın avantajları ve dezavantajları hakkında daha fazla bilgi için Bkz. Veri Katmanı Bileşenleri Tasarlama ve Verileri Katmanlar Aracılığıyla Geçirme.

Bu öğreticilerin mimarisi için kesin türü belirlenmiş DataSets kullanacağız. Şekil 3'de, Türü Belirtilen Veri Kümelerini kullanan bir uygulamanın farklı katmanları arasındaki iş akışı gösterilmektedir.

Tüm Veri Erişim Kodu DAL'ye Relegated

Şekil 3: Tüm Veri Erişim Kodu DAL'ye Relegated (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Türü Yazılan DataSet ve Tablo Bağdaştırıcısı Oluşturma

DAL'mizi oluşturmaya başlamak için projemize Bir Türlenmiş Veri Kümesi ekleyerek başlayacağız. Bunu yapmak için Çözüm Gezgini proje düğümüne sağ tıklayın ve Yeni Öğe Ekle'yi seçin. Şablon listesinden DataSet seçeneğini belirleyin ve Northwind.xsd olarak adlandırın.

Projenize Yeni Veri Kümesi Eklemeyi Seçin

Şekil 4: Projenize Yeni Veri Kümesi Eklemeyi Seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ekle'ye tıkladıktan sonra DataSet'i App_Code klasörüne eklemeniz istendiğinde Evet'i seçin. Yazılan Veri Kümesi'nin Tasarım Aracı görüntülenir ve TableAdapter Yapılandırma Sihirbazı başlatılır ve bu sihirbaz ilk TableAdapter'ınızı Türü Yazılan Veri Kümesi'ne eklemenize olanak tanır.

Türü Belirlenmiş Veri Kümesi, kesin olarak türü belirlenmiş bir veri koleksiyonu görevi görür; her biri kesin olarak belirlenmiş DataRow örneklerinden oluşan, kesin türe sahip DataTable örneklerinden oluşur. Bu öğreticiler serisinde birlikte çalışmamız gereken temel alınan veritabanı tablolarının her biri için kesin olarak türlenmiş bir DataTable oluşturacağız. Ürünler tablosu için bir DataTable oluşturarak başlayalım.

Kesin olarak türü belirlenmiş DataTable'ların, temel alınan veritabanı tablolarındaki verilere nasıl erişeceklerine ilişkin herhangi bir bilgi içermediğini unutmayın. DataTable'ı doldurmak üzere verileri almak için, Veri Erişim Katmanımız olarak işlev gören bir TableAdapter sınıfı kullanırız. Products DataTable için TableAdapter GetProducts(), GetProductByCategoryID(categoryID) yöntemlerini içerir ve bu şekilde sunu katmanından çağıracağız. DataTable'ın rolü, katmanlar arasında veri geçirmek için kullanılan kesin olarak belirlenmiş nesneler olarak görev yapmaktır.

TableAdapter Yapılandırma Sihirbazı, hangi veritabanıyla çalışabileceğinizi seçmenizi isteyip istemediğinizi sorarak başlar. Açılan listede bu veritabanları Sunucu Gezgini'nde gösterilir. Northwind veritabanını Sunucu Gezgini'ne eklemediyseniz, şu anda Yeni Bağlantı düğmesine tıklayarak bunu yapabilirsiniz.

Drop-Down Listesinden Northwind Veritabanı'nı seçin

Şekil 5: Drop-Down Listesinden Northwind Veritabanı'nı seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Veritabanını seçip İleri'ye tıkladıktan sonra, bağlantı dizesi Web.config dosyasına kaydetmek isteyip istemediğiniz sorulur. bağlantı dizesi kaydederek TableAdapter sınıflarında sabit kodlanmış olmasını önlersiniz, bu da gelecekte bağlantı dizesi bilgiler değişirse işleri basitleştirir. bağlantı dizesi yapılandırma dosyasına kaydetmeyi tercih ederseniz, daha iyi güvenlik için isteğe bağlı olarak şifrelenebilir veya daha sonra YÖNETICILER için daha ideal olan IIS GUI Yönetici Aracı içindeki yeni ASP.NET 2.0 Özellik Sayfası aracılığıyla değiştirilebilir connectionStrings> bölümüne yerleştirilir<.

Bağlantı Dizesini Web.configkaydetme

Şekil 6: Bağlantı Dizesini Web.config kaydetme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Daha sonra, kesin olarak türü kesin belirlenmiş ilk DataTable için şemayı tanımlamamız ve kesin olarak türü belirlenmiş DataSet'i doldurarak TableAdapter'ımız için kullanılacak ilk yöntemi sağlamamız gerekir. Bu iki adım, DataTable'ımızdaki yansıtılmasını istediğimiz tablodaki sütunları döndüren bir sorgu oluşturularak aynı anda gerçekleştirilir. Sihirbazın sonunda bu sorguya bir yöntem adı vereceğiz. Bu işlem tamamlandıktan sonra bu yöntem sunu katmanımızdan çağrılabilir. yöntemi tanımlı sorguyu yürütür ve kesin türü belirlenmiş bir DataTable'ı doldurur.

SQL sorgusunu tanımlamaya başlamak için önce TableAdapter'ın sorguyu nasıl yayınlamasını istediğimizi belirtmemiz gerekir. Geçici bir SQL deyimi kullanabilir, yeni bir saklı yordam oluşturabilir veya mevcut bir saklı yordamı kullanabiliriz. Bu öğreticiler için geçici SQL deyimlerini kullanacağız.

Geçici SQL Deyimi Kullanarak Verileri Sorgulama

Şekil 7: Geçici SQL Deyimi Kullanarak Verileri Sorgulama (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu noktada SQL sorgusunu el ile yazabiliriz. TableAdapter'da ilk yöntemi oluştururken genellikle sorgunun ilgili DataTable'da ifade edilmesi gereken sütunları döndürmesini istersiniz. Bunu, Ürünler tablosundaki tüm sütunları ve tüm satırları döndüren bir sorgu oluşturarak gerçekleştirebiliriz:

Metin Kutusuna SQL Sorgusu Girme

Şekil 8: Metin Kutusuna SQL Sorgusu Girin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Alternatif olarak, Şekil 9'da gösterildiği gibi Sorgu Oluşturucusu'nu kullanın ve sorguyu grafik olarak oluştur.

Sorgu Düzenleyicisi aracılığıyla Grafiksel Sorgu oluşturma

Şekil 9: sorguyu Sorgu Düzenleyicisi aracılığıyla Grafik olarak oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sorguyu oluşturduktan sonra, ancak sonraki ekrana geçmeden önce Gelişmiş Seçenekler düğmesine tıklayın. Web Sitesi Projelerinde, "Ekle, Güncelleştir ve Sil deyimleri oluştur" varsayılan olarak seçilen tek gelişmiş seçenektir; Bu sihirbazı bir Sınıf Kitaplığı veya Windows Projesi'nden çalıştırırsanız "İyimser eşzamanlılık kullan" seçeneği de seçilir. "İyimser eşzamanlılık kullan" seçeneğini şimdilik işaretsiz bırakın. Gelecek öğreticilerde iyimser eşzamanlılığı inceleyeceğiz.

Yalnızca Ekleme, Güncelleştirme ve Silme deyimleri Oluştur Seçeneğini Belirleyin

Şekil 10: Yalnızca Ekle, Güncelleştir ve Sil deyimleri Oluştur Seçeneğini belirleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)

Gelişmiş seçenekleri doğruladıktan sonra, son ekrana geçmek için İleri'ye tıklayın. Burada TableAdapter'a hangi yöntemlerin ekleneceğini seçmeniz istenir. Verileri doldurmaya yönelik iki desen vardır:

  • DataTable'ı bu yaklaşımla doldurma DataTable'ı parametre olarak alan ve sorgunun sonuçlarına göre dolduran bir yöntem oluşturulur. Örneğin ADO.NET DataAdapter sınıfı bu deseni Fill() yöntemiyle uygular.
  • Yöntemin sizin için DataTable'ı oluşturup doldurduğu ve yöntem değer döndürdüğünde döndürdüğü bu yaklaşımla bir DataTable döndürür.

TableAdapter'ın bu desenlerden birini veya her ikisini birden gerçekleştirmesini sağlayabilirsiniz. Burada sağlanan yöntemleri de yeniden adlandırabilirsiniz. Bu öğreticiler boyunca yalnızca ikinci düzeni kullansak bile her iki onay kutusunu da işaretli bırakalım. Ayrıca, oldukça genel GetData yöntemini GetProducts olarak yeniden adlandıralım.

İşaretlenirse, "GenerateDBDirectMethods" son onay kutusu TableAdapter için Insert(), Update() ve Delete() yöntemleri oluşturur. Bu seçeneği işaretsiz bırakırsanız, tüm güncelleştirmelerin TableAdapter'ın Typed DataSet, DataTable, tek bir DataRow veya DataRows dizisini alan sole Update() yöntemi aracılığıyla yapılması gerekir. (Şekil 9'daki gelişmiş özelliklerden "Ekle, Güncelleştir ve Sil deyimleri oluştur" seçeneğinin işaretini kaldırdıysanız, bu onay kutusunun ayarının hiçbir etkisi olmaz.) Bu onay kutusunu seçili bırakalım.

GetData olan Yöntem Adını GetProducts olarak değiştirme

Şekil 11: GetData olan Yöntem Adını GetProducts olarak değiştirme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son'a tıklayarak sihirbazı tamamlayın. Sihirbaz kapatıldıktan sonra, yeni oluşturduğumuz DataTable'ı gösteren DataSet Tasarım Aracı döndürülür. Products DataTable'daki (ProductID, ProductName vb.) sütunların listesini ve ProductsTableAdapter (Fill() ve GetProducts()) yöntemlerini görebilirsiniz.

Products DataTable ve ProductsTableAdapter, Türü Belirtilen Veri Kümesine Eklendi

Şekil 12: Products DataTable ve ProductsTableAdapter , Yazılan Veri Kümesine Eklendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu noktada, bir GetProducts() yöntemine sahip tek bir DataTable (Northwind.Products) ve kesin olarak türü belirlenmiş bir DataAdapter sınıfına (NorthwindTableAdapters.ProductsTableAdapter) sahip bir Türü Belirlenmiş DataSet'imiz vardır. Bu nesneler, aşağıdaki gibi kodlardan tüm ürünlerin listesine erişmek için kullanılabilir:

NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
    new NorthwindTableAdapters.ProductsTableAdapter();
Northwind.ProductsDataTable products;
products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow productRow in products)
    Response.Write("Product: " + productRow.ProductName + "<br />");

Bu kod, veri erişimine özgü bir kod yazmamızı gerektirmez. Hiçbir ADO.NET sınıfı örneği oluşturmadık, bağlantı dizelerine, SQL sorgularına veya saklı yordamlara başvurmak zorunda değildik. Bunun yerine TableAdapter, bizim için alt düzey veri erişim kodunu sağlar.

Bu örnekte kullanılan her nesne kesin olarak türlenmiş olduğundan Visual Studio'ya IntelliSense ve derleme zamanı türü denetimi sağlanır. TableAdapter tarafından döndürülen tüm DataTable'ların en iyisi GridView, DetailsView, DropDownList, CheckBoxList ve diğerleri gibi ASP.NET veri Web denetimlerine bağlanabilir. Aşağıdaki örnekte , GetProducts() yöntemi tarafından döndürülen DataTable'ın Page_Load olay işleyicisi içindeki yalnızca üç satırlık bir kodda GridView'a bağlanması gösterilmektedir.

AllProducts.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AllProducts.aspx.cs"
    Inherits="AllProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>View All Products in a GridView</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h2>
            All Products</h2>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

AllProducts.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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;
using NorthwindTableAdapters;
public partial class AllProducts : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ProductsTableAdapter productsAdapter = new
         ProductsTableAdapter();
        GridView1.DataSource = productsAdapter.GetProducts();
        GridView1.DataBind();
    }
}

Ürün Listesi GridView'da Görüntülenir

Şekil 13: Ürün Listesi GridView'da Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu örnek, ASP.NET sayfamızın Page_Load olay işleyicisine üç satır kod yazmamızı gerektirse de, gelecek öğreticilerde, DAL'den verileri bildirimli olarak almak için ObjectDataSource'un nasıl kullanılacağını inceleyeceğiz. ObjectDataSource ile kod yazmamız gerekmeyecek ve sayfalama ve sıralama desteği de alacağız!

3. Adım: Veri Erişim Katmanına Parametreli Yöntemler Ekleme

Bu noktada ProductsTableAdapter sınıfımızın veritabanındaki tüm ürünleri döndüren tek bir yöntemi vardır: GetProducts(). Tüm ürünlerle çalışabilmek kesinlikle yararlı olsa da belirli bir ürün veya belirli bir kategoriye ait tüm ürünler hakkında bilgi almak istediğimiz zamanlar olabilir. Veri Erişim Katmanımıza bu tür işlevler eklemek için TableAdapter'a parametreli yöntemler ekleyebiliriz.

Şimdi GetProductsByCategoryID(categoryID) yöntemini ekleyelim. DAL'ye yeni bir yöntem eklemek için DataSet Tasarım Aracı dönün, ProductsTableAdapter bölümüne sağ tıklayın ve Sorgu Ekle'yi seçin.

TableAdapter'a sağ tıklayın ve Sorgu Ekle'yi seçin

Şekil 14: TableAdapter'da Right-Click ve Sorgu Ekle'yi seçin

İlk olarak geçici bir SQL deyimini veya yeni veya mevcut bir saklı yordamı kullanarak veritabanına erişmek isteyip istemediğimiz sorulur. Geçici SQL deyimini yeniden kullanmayı seçelim. Ardından, ne tür BIR SQL sorgusu kullanmak istediğimiz sorulur. Belirtilen bir kategoriye ait tüm ürünleri döndürmek istediğimizden, satırları döndüren bir SELECT deyimi yazmak istiyoruz.

Satırları Döndüren BIR SELECT Deyimi Oluşturmayı Seçin

Şekil 15: Satırları Döndüren BIR SELECT Deyimi Oluşturmayı Seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sonraki adım, verilere erişmek için kullanılan SQL sorgusunu tanımlamaktır. Yalnızca belirli bir kategoriye ait olan ürünleri döndürmek istediğimiz için GetProducts() ile aynı SELECT deyimini kullanıyorum, ancak şu WHERE yan tümcesini ekliyorum: WHERE CategoryID = @CategoryID. @CategoryID parametresi TableAdapter sihirbazına, oluşturduğumuz yöntemin ilgili türde bir giriş parametresi (null atanabilir bir tamsayı) gerektirdiğini belirtir.

Yalnızca Belirtilen Kategorideki Ürünleri Döndürmek için Bir Sorgu Girin

Şekil 16: Yalnızca Belirtilen Kategorideki Ürünleri Döndürmek için Bir Sorgu Girin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son adımda kullanılacak veri erişim desenlerini seçebilir ve oluşturulan yöntemlerin adlarını özelleştirebiliriz. Dolgu düzeni için adı FillByCategoryID olarak değiştirelim ve DataTable dönüş deseni ( GetX yöntemleri) için GetProductsByCategoryID kullanalım.

TableAdapter Yöntemlerinin Adlarını Seçin

Şekil 17: TableAdapter Yöntemlerinin Adlarını Seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sihirbazı tamamladıktan sonra DataSet Tasarım Aracı yeni TableAdapter yöntemlerini içerir.

Ürünler Artık Kategoriye Göre Sorgulanabilir

Şekil 18: Ürünler Artık Kategoriye Göre Sorgulanabilir

Aynı tekniği kullanarak bir GetProductByProductID(productID) yöntemi eklemek için biraz zaman ayırın.

Bu parametreli sorgular doğrudan DataSet Tasarım Aracı test edilebilir. TableAdapter'da yöntemine sağ tıklayın ve Verileri Önizle'yi seçin. Ardından, parametreler için kullanılacak değerleri girin ve Önizleme'ye tıklayın.

İçecek Kategorisine Ait Ürünler Gösteriliyor

Şekil 19: İçecek Kategorisine Ait Ürünler Gösteriliyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

DAL'mizdeki GetProductsByCategoryID(categoryID) yöntemiyle artık yalnızca belirli bir kategorideki ürünleri görüntüleyen bir ASP.NET sayfası oluşturabiliriz. Aşağıdaki örnek, CategoryID değeri 1 olan İçecekler kategorisindeki tüm ürünleri gösterir.

Beverages.asp

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Beverages.aspx.cs"
    Inherits="Beverages" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h2>Beverages</h2>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

Beverages.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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;
using NorthwindTableAdapters;
public partial class Beverages : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ProductsTableAdapter productsAdapter = new
         ProductsTableAdapter();
        GridView1.DataSource =
          productsAdapter.GetProductsByCategoryID(1);
        GridView1.DataBind();
    }
}

İçecek Kategorisindeki Ürünler Görüntülenir

Şekil 20: İçecek Kategorisindeki Ürünler Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

4. Adım: Veri Ekleme, Güncelleştirme ve Silme

Verileri eklemek, güncelleştirmek ve silmek için yaygın olarak kullanılan iki desen vardır. Veritabanı doğrudan desenini çağıracağım ilk desen, çağrıldığında tek bir veritabanı kaydında çalışan veritabanına INSERT, UPDATE veya DELETE komutu veren yöntemler oluşturmayı içerir. Bu tür yöntemler genellikle eklenecek, güncelleştirilecek veya silinecek değerlere karşılık gelen bir dizi skaler değerde (tamsayılar, dizeler, Boole değerleri, DateTimes vb.) geçirilir. Örneğin, Products tablosu için bu desenle delete yöntemi silinecek kaydın ProductID değerini belirten bir tamsayı parametresine alınırken, insert yöntemi ProductName için bir dize, UnitPrice için ondalık, UnitsOnStock için bir tamsayı vb. alır.

Her Ekleme, Güncelleştirme ve Silme İsteği Veritabanına Hemen Gönderilir

Şekil 21: Her Ekleme, Güncelleştirme ve Silme İsteği Veritabanına Hemen Gönderilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Toplu güncelleştirme deseni olarak adlandıracağım diğer desen ise bir yöntem çağrısında DataSet, DataTable veya DataRows koleksiyonunun tamamını güncelleştirmektir. Bu desenle bir geliştirici DataTable'da DataRows'ı siler, ekler ve değiştirir ve ardından bu DataRow'ları veya DataTable'ı bir güncelleştirme yöntemine geçirir. Bu yöntem daha sonra geçirilen DataRow'ları numaralandırır, değiştirilip değiştirilmediğini, eklenip eklenmediğini veya silinip silinmediğini belirler (DataRow'un RowState özellik değeri aracılığıyla) ve her kayıt için uygun veritabanı isteğini verir.

Güncelleştirme Yöntemi Çağrıldığında Tüm Değişiklikler Veritabanıyla Eşitlenir

Şekil 22: Güncelleştirme Yöntemi Çağrıldığında Tüm Değişiklikler Veritabanı ile Eşitlenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

TableAdapter varsayılan olarak toplu güncelleştirme desenini kullanır, ancak veritabanı doğrudan desenini de destekler. TableAdapter'ımızı oluştururken Gelişmiş Özellikler'den "Ekle, Güncelleştir ve Sil deyimleri oluştur" seçeneğini belirlediğimizden , ProductsTableAdapter toplu güncelleştirme desenini uygulayan bir Update() yöntemi içerir. Özellikle TableAdapter, Türü Belirlenmiş Veri Kümesi, kesin olarak yazılmış bir DataTable veya bir veya daha fazla DataRow geçirilebilen bir Update() yöntemi içerir. TableAdapter'ı ilk oluştururken "GenerateDBDirectMethods" onay kutusunu işaretli bıraktıysanız, db doğrudan deseni de Insert(), Update() ve Delete() yöntemleri aracılığıyla uygulanır.

Her iki veri değişikliği deseni de veritabanına INSERT, UPDATE ve DELETE komutlarını vermek için TableAdapter'ın InsertCommand, UpdateCommand ve DeleteCommand özelliklerini kullanır. InsertCommand, UpdateCommand ve DeleteCommand özelliklerini dataset Tasarım Aracı TableAdapter'a tıklayıp Özellikler penceresi giderek inceleyebilir ve değiştirebilirsiniz. (TableAdapter'ı seçtiğinizden ve ProductsTableAdapter nesnesinin Özellikler penceresi açılan listeden seçilen nesne olduğundan emin olun.)

TableAdapter InsertCommand, UpdateCommand ve DeleteCommand Özelliklerine sahiptir

Şekil 23: TableAdapter'da InsertCommand, UpdateCommand ve DeleteCommand Özellikleri var (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu veritabanı komut özelliklerinden herhangi birini incelemek veya değiştirmek için CommandText alt özelliğine tıklayın; bu, Sorgu Oluşturucusu'nu getirir.

Sorgu Oluşturucusu'nda INSERT, UPDATE ve DELETE Deyimlerini yapılandırma

Şekil 24: Sorgu Oluşturucusu'nda INSERT, UPDATE ve DELETE Deyimlerini yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Aşağıdaki kod örneğinde, toplu güncelleştirme düzeninin, durdurulmayan ve stokta 25 birim veya daha az olan tüm ürünlerin fiyatını ikiye katmak için nasıl kullanılacağı gösterilmektedir:

NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
  new NorthwindTableAdapters.ProductsTableAdapter();
// For each product, double its price if it is not discontinued and
// there are 25 items in stock or less
Northwind.ProductsDataTable products = productsAdapter.GetProducts();
foreach (Northwind.ProductsRow product in products)
   if (!product.Discontinued && product.UnitsInStock <= 25)
      product.UnitPrice *= 2;
// Update the products
productsAdapter.Update(products);

Aşağıdaki kodda, belirli bir ürünü program aracılığıyla silmek, ardından bir ürünü güncelleştirmek ve ardından yeni bir ürün eklemek için veritabanı doğrudan düzeninin nasıl kullanılacağı gösterilmektedir:

NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
    new NorthwindTableAdapters.ProductsTableAdapter();
// Delete the product with ProductID 3
productsAdapter.Delete(3);
// Update Chai (ProductID of 1), setting the UnitsOnOrder to 15
productsAdapter.Update("Chai", 1, 1, "10 boxes x 20 bags",
  18.0m, 39, 15, 10, false, 1);
// Add a new product
productsAdapter.Insert("New Product", 1, 1,
  "12 tins per carton", 14.95m, 15, 0, 10, false);

Özel Ekleme, Güncelleştirme ve Silme Yöntemleri Oluşturma

Db doğrudan yöntemi tarafından oluşturulan Insert(), Update() ve Delete() yöntemleri, özellikle de birçok sütunu olan tablolar için biraz zahmetli olabilir. IntelliSense'in yardımı olmadan önceki kod örneğine baktığımızda, her giriş parametresine hangi Products tablosu sütununun Update() ve Insert() yöntemleriyle eşlendiğinden emin olunmamıştır. Yalnızca bir veya iki sütunu güncelleştirmek istediğimiz veya yeni eklenen kaydın IDENTITY (otomatik artırma) alanının değerini döndürecek özelleştirilmiş bir Insert() yöntemi istediğimiz zamanlar olabilir.

Böyle bir özel yöntem oluşturmak için DataSet Tasarım Aracı dönün. TableAdapter'a sağ tıklayın ve Sorgu Ekle'yi seçerek TableAdapter sihirbazına geri dönerek. İkinci ekranda oluşturulacak sorgu türünü gösterebiliriz. Şimdi yeni bir ürün ekleyen ve ardından yeni eklenen kaydın ProductID değerini döndüren bir yöntem oluşturalım. Bu nedenle , insert sorgusu oluşturmayı tercih edin.

Ürünler Tablosuna Yeni Satır Ekleme Yöntemi Oluşturma

Şekil 25: Ürünler Tablosuna Yeni Satır Eklemek için Yöntem Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sonraki ekranda InsertCommand'ınCommandText'i görüntülenir. Sorgunun sonuna SELECT SCOPE_IDENTITY() ekleyerek bu sorguyu genişletin. Bu, aynı kapsamdaki bir IDENTITY sütununa eklenen son kimlik değerini döndürür. (SCOPE_IDENTITY() ve @@IDENTITYyerine SCOPE_IDENTITY() kullanmak isteme nedenleriniz hakkında daha fazla bilgi için teknik belgelere bakın.) SELECT deyimini eklemeden önce INSERT deyimini noktalı virgülle sonlandırdığınızdan emin olun.

SCOPE_IDENTITY() Değerini Döndürmek için Sorguyu Artırma

Şekil 26: SCOPE_IDENTITY() Değerini Döndürmek için Sorguyu Büyütme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son olarak, yeni yöntemi InsertProduct olarak adlandırın.

Yeni Yöntem Adı'nı InsertProduct olarak ayarlayın

Şekil 27: Yeni Yöntem Adını InsertProduct olarak ayarlayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)

DataSet Tasarım Aracı döndüğünüzde ProductsTableAdapter'ınInsertProduct adlı yeni bir yöntem içerdiğini görürsünüz. Bu yeni yöntemin Products tablosundaki her sütun için bir parametresi yoksa, INSERT deyimini noktalı virgülle sonlandırmayı unutmuş olma olasılığınız vardır. InsertProduct yöntemini yapılandırın ve INSERT ve SELECT deyimlerini sınırlandıran noktalı virgüle sahip olduğunuzdan emin olun.

Varsayılan olarak, ekleme yöntemleri sorgu dışı yöntemler verir; başka bir deyişle, etkilenen satır sayısını döndürürler. Ancak InsertProduct yönteminin etkilenen satır sayısını değil sorgu tarafından döndürülen değeri döndürmesini istiyoruz. Bunu yapmak için InsertProduct yönteminin ExecuteMode özelliğini Scalar olarak ayarlayın.

ExecuteMode Özelliğini Scalar olarak değiştirme

Şekil 28: ExecuteMode Özelliğini Skaler olarak değiştirme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Aşağıdaki kod, bu yeni InsertProduct yönteminin çalıştığını gösterir:

NorthwindTableAdapters.ProductsTableAdapter productsAdapter =
    new NorthwindTableAdapters.ProductsTableAdapter();
// Add a new product
int new_productID = Convert.ToInt32(productsAdapter.InsertProduct
    ("New Product", 1, 1, "12 tins per carton", 14.95m, 10, 0, 10, false));
// On second thought, delete the product
productsAdapter.Delete(new_productID);

5. Adım: Veri Erişim Katmanını Tamamlama

ProductsTableAdapters sınıfının Products tablosundan CategoryID ve SupplierID değerlerini döndürdüğünü, ancak Categories tablosundaki CategoryName sütununu veya Suppliers tablosundaki CompanyName sütununu içermediğini unutmayın, ancak bunlar büyük olasılıkla ürün bilgilerini gösterirken görüntülemek istediğimiz sütunlardır. TableAdapter'ın ilk yöntemi olan GetProducts() öğesini hem CategoryName hem de CompanyName sütun değerlerini içerecek şekilde genişletebiliriz. Bu değer, kesin olarak türü belirlenmiş DataTable'ı da bu yeni sütunları içerecek şekilde güncelleştirir.

Ancak TableAdapter'ın veri ekleme, güncelleştirme ve silme yöntemleri bu ilk yöntemi temel alır. Neyse ki, ekleme, güncelleştirme ve silme için otomatik olarak oluşturulan yöntemler SELECT yan tümcesindeki alt sorgulardan etkilenmez. Sorgularımızı JOIN yerine Kategorilere ve Sağlayıcılara alt sorgular olarak eklemeye dikkat ederek, verileri değiştirmek için bu yöntemleri yeniden çalışmaktan kaçınacağız. ProductsTableAdapter'daGetProducts() yöntemine sağ tıklayın ve Yapılandır'ı seçin. Ardından SELECT yan tümcesini aşağıdaki gibi görünecek şekilde ayarlayın:

SELECT     ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued,
(SELECT CategoryName FROM Categories
WHERE Categories.CategoryID = Products.CategoryID) as CategoryName,
(SELECT CompanyName FROM Suppliers
WHERE Suppliers.SupplierID = Products.SupplierID) as SupplierName
FROM         Products

GetProducts() Yöntemi için SELECT Deyimini Güncelleştirme

Şekil 29: GetProducts() Yöntemi için SELECT Deyimini Güncelleştirme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu yeni sorguyu kullanmak için GetProducts() yöntemini güncelleştirdikten sonra DataTable iki yeni sütun içerir: CategoryName ve SupplierName.

Products DataTable'da İki Yeni Sütun Var

Şekil 30: Products DataTable'da iki yeni sütun var

GetProductsByCategoryID(categoryID) yöntemindeki SELECT yan tümcesini güncelleştirmek için biraz zaman ayırın.

JOIN söz dizimini kullanarak GetProducts()SELECT'i güncelleştirirseniz DataSet Tasarım Aracı veritabanı verilerini ekleme, güncelleştirme ve silme yöntemlerini veritabanı doğrudan desenini kullanarak otomatik olarak oluşturamaz. Bunun yerine, bunları bu öğreticinin önceki bölümlerindeki InsertProduct yönteminde yaptığımız gibi el ile oluşturmanız gerekir. Ayrıca, toplu güncelleştirme düzenini kullanmak istiyorsanız InsertCommand, UpdateCommand ve DeleteCommand özellik değerlerini el ile sağlamanız gerekir.

Kalan TableAdapters'i ekleme

Şimdiye kadar tek bir veritabanı tablosu için tek bir TableAdapter ile çalışmayı inceledik. Ancak Northwind veritabanı, web uygulamamızda birlikte çalışmamız gereken birkaç ilgili tablo içerir. Yazılan Veri Kümesi birden çok ilgili DataTable içerebilir. Bu nedenle DAL'mizi tamamlamak için bu öğreticilerde kullanacağımız diğer tablolar için DataTable'lar eklemeliyiz. Yazılan DataSet'e yeni bir TableAdapter eklemek için DataSet Tasarım Aracı açın, Tasarım Aracı sağ tıklayın ve Ekle / TabloAdapter'ı seçin. Bu, yeni bir DataTable ve TableAdapter oluşturur ve bu öğreticinin önceki bölümlerinde incelediğimiz sihirbazda size yol gösterir.

Aşağıdaki sorguları kullanarak aşağıdaki TableAdapters ve yöntemlerini oluşturmak birkaç dakika sürebilir. ProductsTableAdapter'daki sorguların, her ürünün kategorisini ve sağlayıcı adlarını almak için alt sorguları içerdiğini unutmayın. Ayrıca, takip ediyorsanız ProductsTableAdapter sınıfının GetProducts() ve GetProductsByCategoryID(categoryID) yöntemlerini zaten eklemişsinizdir.

  • ProductsTableAdapter

    • GetProducts:

      SELECT     ProductID, ProductName, SupplierID, 
      CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, 
      UnitsOnOrder, ReorderLevel, Discontinued, 
      (SELECT CategoryName FROM Categories WHERE
      Categories.CategoryID = Products.CategoryID) as 
      CategoryName, (SELECT CompanyName FROM Suppliers
      WHERE Suppliers.SupplierID = Products.SupplierID) 
      as SupplierName
      FROM         Products
      
    • GetProductsByCategoryID:

      SELECT     ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued, (SELECT CategoryName
      FROM Categories WHERE Categories.CategoryID = 
      Products.CategoryID) as CategoryName,
      (SELECT CompanyName FROM Suppliers WHERE
      Suppliers.SupplierID = Products.SupplierID)
      as SupplierName
      FROM         Products
      WHERE      CategoryID = @CategoryID
      
    • GetProductsBySupplierID:

      SELECT     ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued, (SELECT CategoryName
      FROM Categories WHERE Categories.CategoryID = 
      Products.CategoryID) as CategoryName, 
      (SELECT CompanyName FROM Suppliers WHERE 
      Suppliers.SupplierID = Products.SupplierID) as SupplierName
      FROM         Products
      WHERE SupplierID = @SupplierID
      
    • GetProductByProductID:

      SELECT     ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued, (SELECT CategoryName 
      FROM Categories WHERE Categories.CategoryID = 
      Products.CategoryID) as CategoryName, 
      (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID) 
      as SupplierName
      FROM         Products
      WHERE ProductID = @ProductID
      
  • CategoriesTableAdapter

    • GetCategories:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      
    • GetCategoryByCategoryID:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      WHERE CategoryID = @CategoryID
      
  • SuppliersTableAdapter

    • GetSuppliers:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      
    • GetSuppliersByCountry:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      WHERE Country = @Country
      
    • GetSupplierBySupplierID:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      WHERE SupplierID = @SupplierID
      
  • EmployeesTableAdapter

    • GetEmployees:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      
    • GetEmployeesByManager:

      SELECT     EmployeeID, LastName, FirstName, Title, 
      HireDate, ReportsTo, Country
      FROM         Employees
      WHERE ReportsTo = @ManagerID
      
    • GetEmployeeByEmployeeID:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      WHERE EmployeeID = @EmployeeID
      

Dört TableAdapters Eklendikten Sonra DataSet Tasarım Aracı

Şekil 31: Dört TableAdapters Eklendikten Sonra DataSet Tasarım Aracı (Tam boyutlu görüntüyü görüntülemek için tıklayın)

DAL'ye Özel Kod Ekleme

Typed DataSet'e eklenen TableAdapters ve DataTable'lar bir XML Şema Tanımı dosyası (Northwind.xsd) olarak ifade edilir. Çözüm Gezgini Northwind.xsd dosyasına sağ tıklayıp Kodu Görüntüle'yi seçerek bu şema bilgilerini görüntüleyebilirsiniz.

Northwinds TürüNezilen DataSet için XML Şema Tanımı (XSD) Dosyası

Şekil 32: Northwinds Yazılan Veri Kümesi için XML Şema Tanımı (XSD) Dosyası (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bu şema bilgileri, derlendiğinde veya çalışma zamanında (gerekirse) tasarım zamanında C# veya Visual Basic koduna çevrilir ve bu noktada hata ayıklayıcı ile adım adım ilerleyebilirsiniz. Otomatik olarak oluşturulan bu kodu görüntülemek için Sınıf Görünümü'ne gidin ve TableAdapter veya Typed DataSet sınıflarına gidin. Ekranınızda Sınıf Görünümü'nü görmüyorsanız, Görünüm menüsüne gidin ve buradan seçin veya Ctrl+Shift+C tuşlarına basın. Sınıf Görünümü'nden Typed DataSet ve TableAdapter sınıflarının özelliklerini, yöntemlerini ve olaylarını görebilirsiniz. Belirli bir yöntemin kodunu görüntülemek için Sınıf Görünümü'nde yöntem adına çift tıklayın veya sağ tıklayıp Tanıma Git'i seçin.

Sınıf Görünümünden Tanıma Git'i seçerek otomatik olarak oluşturulan kodu inceleyin

Şekil 33: Sınıf Görünümünden Tanıma Git'i seçerek Otomatik Oluşturulan Kodu İnceleme

Otomatik olarak oluşturulan kod harika bir zaman tasarrufu sağlayabilir ancak genellikle çok geneldir ve bir uygulamanın benzersiz gereksinimlerini karşılamak için özelleştirilmesi gerekir. Ancak otomatik olarak oluşturulan kodu genişletme riski, kodu oluşturan aracın özelleştirmelerinizi "yeniden oluşturma" ve üzerine yazma zamanına karar vermesine neden olabilir. .NET 2.0'ın yeni kısmi sınıf kavramıyla, bir sınıfı birden çok dosyaya bölmek kolaydır. Bu, Visual Studio'yu özelleştirmelerimizin üzerine yazma konusunda endişelenmenize gerek kalmadan otomatik olarak oluşturulan sınıflara kendi yöntemlerimizi, özelliklerimizi ve olaylarımızı eklememizi sağlar.

DAL'yi özelleştirmeyi göstermek için SuppliersRow sınıfına bir GetProducts() yöntemi ekleyelim. SuppliersRow sınıfı Suppliers tablosundaki tek bir kaydı temsil eder; her sağlayıcı birçok ürüne sıfır sağlayabilir, bu nedenle GetProducts() belirtilen sağlayıcının bu ürünlerini döndürür. Bunu gerçekleştirmek için SuppliersRow.cs adlı App_Code klasöründe yeni bir sınıf dosyası oluşturun ve aşağıdaki kodu ekleyin:

using System;
using System.Data;
using NorthwindTableAdapters;
public partial class Northwind
{
    public partial class SuppliersRow
    {
        public Northwind.ProductsDataTable GetProducts()
        {
            ProductsTableAdapter productsAdapter =
             new ProductsTableAdapter();
            return
              productsAdapter.GetProductsBySupplierID(this.SupplierID);
        }
    }
}

Bu kısmi sınıf, derleyiciye Northwind.SuppliersRow sınıfını oluştururken az önce tanımladığımız GetProducts() yöntemini içermesini bildirir. Projenizi derleyip Sınıf Görünümü'ne dönerseniz GetProducts() öğesinin artık Northwind.SuppliersRow yöntemi olarak listelendiğini görürsünüz.

GetProducts() Yöntemi Artık Northwind.SuppliersRow Sınıfının Bir Parçasıdır

Şekil 34: GetProducts() Yöntemi Artık Northwind.SuppliersRow Sınıfının Bir Parçasıdır

GetProducts() yöntemi artık aşağıdaki kodda gösterildiği gibi belirli bir sağlayıcının ürün kümesini listelemek için kullanılabilir:

NorthwindTableAdapters.SuppliersTableAdapter suppliersAdapter =
    new NorthwindTableAdapters.SuppliersTableAdapter();
// Get all of the suppliers
Northwind.SuppliersDataTable suppliers =
  suppliersAdapter.GetSuppliers();
// Enumerate the suppliers
foreach (Northwind.SuppliersRow supplier in suppliers)
{
    Response.Write("Supplier: " + supplier.CompanyName);
    Response.Write("<ul>");
    // List the products for this supplier
    Northwind.ProductsDataTable products = supplier.GetProducts();
    foreach (Northwind.ProductsRow product in products)
        Response.Write("<li>" + product.ProductName + "</li>");
    Response.Write("</ul><p> </p>");
}

Bu veriler herhangi bir ASP'de de görüntülenebilir. NET'in veri Web denetimleri. Aşağıdaki sayfada iki alan içeren bir GridView denetimi kullanılır:

  • Her sağlayıcının adını görüntüleyen bir BoundField ve
  • Her sağlayıcı için GetProducts() yöntemi tarafından döndürülen sonuçlara bağlı bir BulletedList denetimi içeren TemplateField.

Gelecek öğreticilerde bu tür ana ayrıntı raporlarının nasıl görüntüleneceğini inceleyeceğiz. Şimdilik, bu örnek Northwind.SuppliersRow sınıfına eklenen özel yöntemi kullanarak göstermek üzere tasarlanmıştır.

SuppliersAndProducts.aspx

<%@ Page Language="C#" CodeFile="SuppliersAndProducts.aspx.cs"
    AutoEventWireup="true" Inherits="SuppliersAndProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h2>
            Suppliers and Their Products</h2>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             AutoGenerateColumns="False"
             CssClass="DataWebControlStyle">
                <HeaderStyle CssClass="HeaderStyle" />
                <AlternatingRowStyle CssClass="AlternatingRowStyle" />
                <Columns>
                    <asp:BoundField DataField="CompanyName"
                      HeaderText="Supplier" />
                    <asp:TemplateField HeaderText="Products">
                        <ItemTemplate>
                            <asp:BulletedList ID="BulletedList1"
                             runat="server" DataSource="<%# ((Northwind.SuppliersRow) ((System.Data.DataRowView) Container.DataItem).Row).GetProducts() %>"
                                 DataTextField="ProductName">
                            </asp:BulletedList>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

SuppliersAndProducts.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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;
using NorthwindTableAdapters;
public partial class SuppliersAndProducts : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        SuppliersTableAdapter suppliersAdapter = new
          SuppliersTableAdapter();
        GridView1.DataSource = suppliersAdapter.GetSuppliers();
        GridView1.DataBind();
    }
}

Tedarikçinin Şirket Adı Sol Sütunda, Ürünleri Sağda Listelenir

Şekil 35: Sağlayıcının Şirket Adı Sol Sütunda, Ürünleri Sağda Listelenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Özet

Bir web uygulaması oluştururken DAL,sunu katmanınızı oluşturmaya başlamadan önce ilk adımlarınızdan biri olmalıdır. Visual Studio ile, Yazılan Veri Kümelerini temel alan bir DAL oluşturmak, bir kod satırı yazmadan 10-15 dakika içinde gerçekleştirilebilecek bir görevdir. Bu DAL'nin üzerine ilerleyen öğreticiler eklenecektir. Sonraki öğreticide bir dizi iş kuralı tanımlayacak ve bunları ayrı bir İş Mantığı Katmanında nasıl uygulayacağımızı göreceğiz.

Mutlu Programlama!

Daha Fazla Bilgi

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Bu Öğreticide Yer Alan Konularda Video Eğitimi

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 Ron Green, Hilton Giesenow, Dennis Patterson, Liz Shulok, Abel Gomez ve Carlos Santos oldu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana adresinden bir satır mitchell@4GuysFromRolla.combırakın.